diff --git a/library/ngnpro_client.php b/library/ngnpro_client.php index 85d3652..5f41a9b 100644 --- a/library/ngnpro_client.php +++ b/library/ngnpro_client.php @@ -1,15796 +1,15807 @@ SoapEngine() function if ($adminonly) { $login_credentials=array( 'login_type' => 'admin', 'reseller' => $reseller, 'customer' => $customer, 'extra_form_elements' => array() ); } else { $login_credentials=array( 'login_type' => 'reseller', 'soap_username' => $soapUsername, 'soap_password' => $soapPassword, 'reseller' => $reseller, 'customer' => $customer, 'extra_form_elements' => array() ); } // login_credentials can overwite SoapEngine->ports $login_credentials['ports']['customers'] = array( 'records_class' => 'Customers', 'name' => 'Login accounts', 'soap_class' => 'WebService_NGNPro_CustomerPort', 'category' => 'general', 'description' => 'Manage login accounts, customer information and properties. Customer id can be assigned to entities like SIP domains and ENUM ranges. Use _ or % to match one or more characters. ' ); require_once("ngnpro_client.phtml"); require("/etc/cdrtool/ngnpro_engines.inc"); $extraFormElements=array(); //////////////////////////////// // How to create a SIP record // //////////////////////////////// $sip_engine = 'sip_accounts@engine'; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $sipAccount = array('account' => 'user@example.com', 'quota' => $quota, 'prepaid' => $prepaid, 'password' => $password, 'pstn' => true, 'owner' => $owner, 'customer' => $customer, 'reseller' => $reseller ); $this->sipRecords->addRecord($sipAccount); //////////////////////////////// // How to create a SIP domain // //////////////////////////////// $sip_engine = 'sip_accounts@engine'; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $sipDomain = array('domain' => 'example.com', 'customer' => $customer, 'reseller' => $reseller ); $this->sipRecords->addRecord($sipDomain); /////////////////////////////// // How to create a SIP alias // /////////////////////////////// $sip_engine = 'sip_aliases@engine'; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $sipAlias = array('alias' => 'user@example1.com', 'target' => 'user@example2.com', 'owner' => $owner, 'customer' => $customer, 'reseller' => $reseller ); $this->sipRecords->addRecord($sipAlias); /////////////////////////////////// // How to create an ENUM mapping // /////////////////////////////////// $enum_engine = 'enum_numbers@engine'; $this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials); $_enum_class = $this->EnumSoapEngine->records_class; $this->enumRecords = new $_enum_class($this->EnumSoapEngine); $enumMapping = array('tld' => $tld, 'number' => $number, 'type' => 'sip', 'mapto' => 'sip:user@example.com', 'owner' => $owner, 'customer' => $customer, 'reseller' => $reseller ); $this->enumRecords->addRecord($enumMapping); */ class SoapEngine { public $version = 1; public $adminonly = 0; public $customer = 0; public $reseller = 0; public $login_type = 'reseller'; public $allowedPorts = array(); public $timeout = 5; public $exception = array(); public $result = false; public $extraFormElements = array(); public $default_enum_tld = 'e164.arpa'; public $default_timezone = 'Europe/Amsterdam'; public $default_sip_proxy = ""; public $default_msrp_relay = ""; public $ports = array( 'sip_accounts' => array( 'records_class' => 'SipAccounts', 'name' => 'SIP accounts', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage SIP accounts and their settings. Click on the SIP account to access the settings page. Use _ or % to match one or more characters. ', ), 'customers' => array( 'records_class' => 'Customers', 'name' => 'Owner Accounts', 'soap_class' => 'WebService_NGNPro_CustomerPort', 'category' => 'general', 'description' => 'Manage accounts with address information and other properties. SIP domains and ENUM ranges can be assigned to accounts. Use _ or % to match one or more characters. ' ), 'sip_domains' => array( 'records_class' => 'SipDomains', 'name' => 'SIP domains', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage SIP domains (e.g example.com) served by the SIP Proxy. Use _ or % to match one or more characters. ' ), 'trusted_peers' => array( 'records_class' => 'TrustedPeers', 'name' => 'SIP trusted peers', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage trusted parties that are allowed to route sessions through the SIP proxy without digest authentication. ', 'resellers_only'=> true ), 'enum_numbers' => array( 'records_class' => 'EnumMappings', 'name' => 'ENUM numbers', 'soap_class' => 'WebService_NGNPro_EnumPort', 'category' => 'dns', 'description' => 'Manage E164 numbers used for incoming calls and their mappings (e.g. +31123456789 map to sip:user@example.com). Use _ or % to match one or more characters. ' ), 'enum_ranges' => array( 'records_class' => 'EnumRanges', 'name' => 'ENUM ranges', 'soap_class' => 'WebService_NGNPro_EnumPort', 'category' => 'dns', 'description' => 'Manage E164 number ranges that hold individual phone numbers. Use _ or % to match one or more characters. ' ), 'dns_zones' => array( 'records_class' => 'DnsZones', 'name' => 'DNS zones', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage DNS zones. Use _ or % to match one or more characters. ' ), 'dns_records' => array( 'records_class' => 'DnsRecords', 'name' => 'DNS records', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage DNS records. Use _ or % to match one or more characters. ' ), 'pstn_carriers' => array( 'records_class' => 'Carriers', 'name' => 'PSTN carriers', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage outbound carriers for PSTN traffic. Click on Carier to edit its attributes. ', 'resellers_only'=> true ), 'pstn_gateways' => array( 'records_class' => 'Gateways', 'name' => 'PSTN gateways', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage outbound PSTN gateways. Click on Gateway to edit its attributes. ', 'resellers_only'=> true ), 'pstn_routes' => array( 'records_class' => 'Routes', 'name' => 'PSTN routes', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage outbound PSTN routes. A prefix must be formated as 00+E164, an empty prefix matches all routes. ', 'resellers_only'=> true ), 'gateway_rules' => array( 'records_class' => 'GatewayRules', 'name' => 'PSTN rules', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage translation rules for PSTN gateways. Rules are applied against 00+E164 prefix. Click on Rule to edit its attributes. ', 'resellers_only'=> true ), 'email_aliases' => array( 'records_class' => 'EmailAliases', 'name' => 'Email aliases', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage email aliases. Use _ or % to match one or more characters. ' ), 'url_redirect' => array( 'records_class' => 'UrlRedirect', 'name' => 'URL redirect', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage WEB URL redirections. Use _ or % to match one or more characters. ' ), 'sip_aliases' => array( 'records_class' => 'SipAliases', 'name' => 'SIP aliases', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage redirections for SIP addresses e.g. redirect user1@example1.com (alias) to user2@example2.com (target). Use _ or % to match one or more characters. ' ) ); /** * service is port@engine where: * * - port is an available NGNPro service * - engine is a connection to an NGNPro server * * - soapEngines is an array of NGNPro connections and * settings belonging to them: * * $soapEngines = array( * 'mdns' => array( * 'name' => 'Managed DNS', * 'username' => 'soapadmin', * 'password' => 'passwd', * 'url' => 'http://example.com:9200/' * ) * ); */ public function __construct($service, $soapEngines, $login_credentials = array()) { $this->login_credentials = &$login_credentials; if (is_array($this->login_credentials['ports'])) { $_ports = array(); foreach (array_keys($this->ports) as $_key) { if (in_array($_key, array_keys($this->login_credentials['ports']))) { if (strlen($this->login_credentials['ports'][$_key]['records_class'])) { $_ports[$_key]['records_class'] = $this->login_credentials['ports'][$_key]['records_class']; } else { $_ports[$_key]['records_class'] = $this->ports[$_key]['records_class']; } if (strlen($this->login_credentials['ports'][$_key]['soap_class'])) { $_ports[$_key]['soap_class'] = $this->login_credentials['ports'][$_key]['soap_class']; } else { $_ports[$_key]['soap_class'] = $this->ports[$_key]['soap_class']; } if (strlen($this->login_credentials['ports'][$_key]['name'])) { $_ports[$_key]['name'] = $this->login_credentials['ports'][$_key]['name']; } else { $_ports[$_key]['name'] = $this->ports[$_key]['name']; } if (strlen($this->login_credentials['ports'][$_key]['description'])) { $_ports[$_key]['description'] = $this->login_credentials['ports'][$_key]['description']; } else { $_ports[$_key]['description'] = $this->ports[$_key]['description']; } } else { $_ports[$_key] = $this->ports[$_key]; } } $this->ports = $_ports; } //dprint_r($this->login_credentials); if ($this->login_credentials['login_type'] == 'admin') $this->adminonly = 1; if (strlen($this->login_credentials['soap_filter'])) { $this->soapEngines = $this->getSoapEngineAllowed($soapEngines, $this->login_credentials['soap_filter']); } else { $this->soapEngines = $soapEngines; } if (is_array($this->soapEngines)) { $_engines = array_keys($this->soapEngines); if (!$service) { // use first engine available if (is_array($this->allowedPorts) && count($this->allowedPorts[$_engines[0]]) > 0) { $_ports = $this->allowedPorts[$_engines[0]]; } else { $_ports = array_keys($this->ports); } // default service is: $service = $_ports[0].'@'.$_engines[0]; } if (is_array($this->login_credentials['extra_form_elements'])) { $this->extraFormElements = $this->login_credentials['extra_form_elements']; } $this->service = $service; $_els = explode('@', $this->service); if (!$_els[1]) { $this->soapEngine = $_engines[0]; } else { $this->soapEngine = $_els[1]; } $this->sip_engine = $this->soapEngine; if (strlen($this->soapEngines[$this->soapEngine]['version'])) { $this->version = $this->soapEngines[$this->soapEngine]['version']; } $default_port = 'customers'; if (count($this->allowedPorts[$this->soapEngine]) > 0) { if (in_array($_els[0], $this->allowedPorts[$this->soapEngine])) { $this->port = $_els[0]; } else if (in_array($default_port, $this->allowedPorts[$this->soapEngine])) { $this->port = $default_port; } else { // disable some version dependent ports foreach (array_keys($this->ports) as $_p) { if (in_array($_p, $this->allowedPorts[$this->soapEngine])) { $this->port = $_p; break; } } } } else { if ($_els[0]) { $this->port = $_els[0]; } else { $this->port = $default_port; } } $this->records_class = $this->ports[$this->port]['records_class']; $this->soap_class = $this->ports[$this->port]['soap_class']; $this->service = $this->port.'@'.$this->soapEngine; foreach (array_keys($this->soapEngines) as $_key) { $this->skip[$_key] = $this->soapEngines[$_key]['skip']; if ($this->soapEngines[$_key]['skip_ports']) { $this->skip_ports[$_key] = $this->soapEngines[$_key]['skip_ports']; } } $this->impersonate = intval($this->soapEngines[$this->soapEngine]['impersonate']); if ($this->soapEngines[$this->soapEngine]['default_enum_tld']) { $this->default_enum_tld = $this->soapEngines[$this->soapEngine]['default_enum_tld']; } if ($this->soapEngines[$this->soapEngine]['default_timezone']) { $this->default_timezone = $this->soapEngines[$this->soapEngine]['default_timezone']; } if ($this->soapEngines[$this->soapEngine]['sip_proxy']) { $this->default_sip_proxy = $this->soapEngines[$this->soapEngine]['sip_proxy']; } if ($this->soapEngines[$this->soapEngine]['msrp_relay']) { $this->default_msrp_relay = $this->soapEngines[$this->soapEngine]['msrp_relay']; } if ($this->soapEngines[$this->soapEngine]['default_country']) { $this->default_country = $this->soapEngines[$this->soapEngine]['default_country']; } if (strlen($this->soapEngines[$this->soapEngine]['sip_engine'])) { $this->sip_engine = $this->soapEngines[$this->soapEngine]['sip_engine']; } if (strlen($this->soapEngines[$this->soapEngine]['voicemail_engine'])) { $this->voicemail_engine = $this->soapEngines[$this->soapEngine]['voicemail_engine']; } if (strlen($this->login_credentials['customer_engine'])) { $this->customer_engine = $this->login_credentials['customer_engine']; } else if (strlen($this->soapEngines[$this->soapEngine]['customer_engine'])) { $this->customer_engine = $this->soapEngines[$this->soapEngine]['customer_engine']; } else { $this->customer_engine = $this->soapEngine; } if (strlen($this->soapEngines[$this->soapEngine]['sip_settings_page'])) { $this->sip_settings_page = $this->soapEngines[$this->soapEngine]['sip_settings_page']; } if (strlen($this->soapEngines[$this->soapEngine]['call_limit'])) { $this->call_limit = $this->soapEngines[$this->soapEngine]['call_limit']; } if (strlen($this->soapEngines[$this->soapEngine]['digest_settings_page'])) { $this->digest_settings_page = $this->soapEngines[$this->soapEngine]['digest_settings_page']; } if (is_array($this->soapEngines[$this->soapEngine]['customer_properties'])) { $this->customer_properties = $this->soapEngines[$this->soapEngine]['customer_properties']; } if (strlen($this->soapEngines[$this->soapEngine]['timeout'])) { $this->timeout = intval($this->soapEngines[$this->soapEngine]['timeout']); } if (strlen($this->soapEngines[$this->soapEngine]['store_clear_text_passwords'])) { $this->store_clear_text_passwords = $this->soapEngines[$this->soapEngine]['store_clear_text_passwords']; } if (strlen($this->soapEngines[$this->soapEngine]['allow_none_local_dns_zones'])) { $this->allow_none_local_dns_zones = $this->soapEngines[$this->soapEngine]['allow_none_local_dns_zones']; } if (strlen($this->login_credentials['record_generator'])) { $this->record_generator = $this->login_credentials['record_generator']; } else if (strlen($this->soapEngines[$this->soapEngine]['record_generator'])) { $this->record_generator = $this->soapEngines[$this->soapEngine]['record_generator']; } if (strlen($this->login_credentials['name_servers'])) { $this->name_servers = $this->login_credentials['name_servers']; } else if (strlen($this->soapEngines[$this->soapEngine]['name_servers'])) { $this->name_servers = $this->soapEngines[$this->soapEngine]['name_servers']; } if (strlen($login_credentials['reseller'])) { $this->reseller = $login_credentials['reseller']; } else if ($this->adminonly && $_REQUEST['reseller_filter']) { $this->reseller = $_REQUEST['reseller_filter']; } if (strlen($login_credentials['customer'])) { $this->customer = $login_credentials['customer']; } else if ($this->adminonly && $_REQUEST['customer_filter']) { $this->customer = $_REQUEST['customer_filter']; } if (strlen($login_credentials['soap_username'])) { $this->soapUsername=$login_credentials['soap_username']; $this->SOAPlogin = array( "username" => $this->soapUsername, "password" => $login_credentials['soap_password'], "admin" => false ); } else { // use the credentials defined for the soap engine $this->soapUsername = $this->soapEngines[$this->soapEngine]['username']; if ($this->customer) { $this->SOAPlogin = array( "username" => $this->soapUsername, "password" => $this->soapEngines[$this->soapEngine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); } else { $this->SOAPlogin = array( "username" => $this->soapUsername, "password" => $this->soapEngines[$this->soapEngine]['password'], "admin" => true, "impersonate" => intval($this->reseller) ); } $this->SOAPloginAdmin = array( "username" => $this->soapUsername, "password" => $this->soapEngines[$this->soapEngine]['password'], "admin" => true ); } $this->SOAPurl = $this->soapEngines[$this->soapEngine]['url']; $log = sprintf( "

%s at %s as %s ", $this->soap_class, $this->SOAPurl, $this->SOAPurl, $this->soapUsername ); dprint($log); $this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $this->SoapAuthAdmin = array('auth', $this->SOAPloginAdmin , 'urn:AGProjects:NGNPro', 0, ''); // Instantiate the SOAP client if (!class_exists($this->soap_class)) return ; $this->soapclient = new $this->soap_class($this->SOAPurl); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); // set the timeout $this->soapclient->_options['timeout'] = $this->timeout; if ($this->customer_engine) { $this->SOAPloginCustomers = array( "username" => $this->soapEngines[$this->customer_engine]['username'], "password" => $this->soapEngines[$this->customer_engine]['password'], "admin" => true, "impersonate" => intval($this->reseller) ); $this->SoapAuthCustomers = array('auth', $this->SOAPloginCustomers , 'urn:AGProjects:NGNPro', 0, ''); $this->SOAPurlCustomers = $this->soapEngines[$this->customer_engine]['url']; $this->soapclientCustomers = new WebService_NGNPro_CustomerPort($this->SOAPurlCustomers); $this->soapclientCustomers->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclientCustomers->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if (strlen($this->soapEngines[$this->customer_engine]['timeout'])) { $this->soapclientCustomers->_options['timeout'] = intval($this->soapEngines[$this->customer_engine]['timeout']); } else { $this->soapclientCustomers->_options['timeout'] = $this->timeout; } } if ($this->voicemail_engine) { $this->SOAPloginVoicemail = array( "username" => $this->soapEngines[$this->voicemail_engine]['username'], "password" => $this->soapEngines[$this->voicemail_engine]['password'], "admin" => true, "impersonate" => intval($this->reseller) ); $this->SoapAuthVoicemail = array('auth', $this->SOAPloginVoicemail , 'urn:AGProjects:NGNPro', 0, ''); $this->SOAPurlVoicemail = $this->soapEngines[$this->voicemail_engine]['url']; $this->soapclientVoicemail = new WebService_NGNPro_VoicemailPort($this->SOAPurlVoicemail); $this->soapclientVoicemail->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclientVoicemail->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if (strlen($this->soapEngines[$this->voicemail_engine]['timeout'])) { $this->soapclientVoicemail->_options['timeout'] = intval($this->soapEngines[$this->voicemail_engine]['timeout']); } else { $this->soapclientVoicemail->_options['timeout'] = $this->timeout; } } } else { print "Error: No SOAP credentials defined."; } $this->url = $_SERVER['PHP_SELF']."?1=1"; foreach (array_keys($this->extraFormElements) as $element) { if (!strlen($this->extraFormElements[$element])) continue; $this->url .= sprintf( '&%s=%s', $element, urlencode($this->extraFormElements[$element]) ); } $this->support_email = $this->soapEngines[$this->soapEngine]['support_email']; $this->support_web = $this->soapEngines[$this->soapEngine]['support_web']; $this->welcome_message = $this->soapEngines[$this->soapEngine]['welcome_message']; } /** * returns a list of allowed engines based on a filter * the filter format is: * engine1:port1,port2 engine2 engine3:port1 */ public function getSoapEngineAllowed($soapEngines, $filter) { if (!$filter) { $soapEngines_checked = $soapEngines; } else { $_filter_els = explode(" ", $filter); foreach (array_keys($soapEngines) as $_engine) { foreach ($_filter_els as $_filter) { unset($_allowed_engine); $_allowed_ports = array(); list($_allowed_engine, $_allowed_ports_els) = explode(":", $_filter); if ($_allowed_ports_els) { $_allowed_ports = explode(",", $_allowed_ports_els); } if (count($_allowed_ports) == 0) { $_allowed_ports = array_keys($this->ports); } if ($_engine == $_allowed_engine) { $soapEngines_checked[$_engine] = $soapEngines[$_engine]; $this->allowedPorts[$_engine] = $_allowed_ports; continue; } } } } return $soapEngines_checked; } /** * $function = array( * 'commit' => array( * 'name' => 'addAccount', * 'parameters' => array( * $param1, * $param2 * ), * 'logs' => array( * 'success' => 'The function was a success', * 'failure' => 'The function has failed' * ) * ) * ); */ public function execute($function, $html = true, $adminonly = false) { if (!$function['commit']['name']) { if ($html) { print "Error: no function name supplied"; } else { print "Error: no function name supplied\n"; } return false; } if ($adminonly) { $this->soapclient->addHeader($this->SoapAuthAdmin); } else { $this->soapclient->addHeader($this->SoapAuth); } $result = call_user_func_array( array( $this->soapclient, $function['commit']['name'] ), $function['commit']['parameters'] ); if ((new PEAR)->isError($result)) { $this->error_msg = $result->getMessage(); $this->error_fault = $result->getFault(); $this->error_code = $result->getCode(); $this->exception = $this->error_fault->detail->exception; $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SOAPurl, $this->error_msg, $this->error_fault->detail->exception->errorcode, $this->error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); if ($html) { $log = sprintf( "Failed to add record: %s (%s): %s", $this->error_msg, $this->error_fault->detail->exception->errorcode, $this->error_fault->detail->exception->errorstring ); print "$log"; } return false; } else { $this->result = $result; if ($function['commit']['logs']['success']) { if ($html) { printf( "

%s \n", htmlentities($function['commit']['logs']['success']) ); } } if (is_object($result) || strlen($result)) { return $result; } else { return true; } } } } class Records { public $maxrowsperpage = '20'; public $sip_settings_page = 'sip_settings.phtml'; public $allowedDomains = array(); public $selectionActive = false; public $selectionKeys = array(); public $resellers = array(); public $customers = array(); public $record_generator = false; public $customer_properties = array(); public $loginProperties = array(); public $errorMessage = ''; public $html = true; public $filters = array(); public $selectionActiveExceptions = array(); function log_action($action = 'Unknown') { global $CDRTool; $location = "Unknown"; $_loc = geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $location = $_loc['country_name']; } $log = sprintf( "CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s", $this->login_credentials['username'], $this->login_credentials['login_type'], $CDRTool['impersonate'], $_SERVER['REMOTE_ADDR'], $location, $this->SoapEngine->port, $action, $_SERVER['PHP_SELF'] ); syslog(LOG_NOTICE, $log); } function Records($SoapEngine) { $this->SoapEngine = $SoapEngine; $this->version = $this->SoapEngine->version; $this->login_credentials = $this->SoapEngine->login_credentials; $this->sorting['sortBy'] = trim($_REQUEST['sortBy']); $this->sorting['sortOrder'] = trim($_REQUEST['sortOrder']); $this->next = $_REQUEST['next']; $this->adminonly = $this->SoapEngine->adminonly; $this->reseller = $this->SoapEngine->reseller; $this->customer = $this->SoapEngine->customer; $this->impersonate = $this->SoapEngine->impersonate; $this->url = $this->SoapEngine->url; foreach (array_keys($this->filters) as $_filter) { if (strlen($this->filters[$_filter]) && !in_array($_filter, $this->selectionActiveExceptions)) { $this->selectionActive = true; break; } } if ($this->adminonly) { $this->url .= sprintf('&adminonly=%s', $this->adminonly); if ($this->login_credentials['reseller']) { $this->filters['reseller'] = $this->login_credentials['reseller']; } else { $this->filters['reseller'] = trim($_REQUEST['reseller_filter']); } } $this->filters['customer'] = trim($_REQUEST['customer_filter']); //$this->getResellers(); $this->getCustomers(); $this->getLoginAccount(); if (strlen($this->SoapEngine->sip_settings_page)) { $this->sip_settings_page = $this->SoapEngine->sip_settings_page; } if (strlen($this->SoapEngine->digest_settings_page)) { $this->digest_settings_page = $this->SoapEngine->digest_settings_page; } $this->support_email = $this->SoapEngine->support_email; $this->support_web = $this->SoapEngine->support_web; } function showEngineSelection() { $selected_soapEngine[$this->SoapEngine->service] =' selected'; $pstn_access = $this->getCustomerProperty('pstn_access'); printf(""); printf( "", $this->url ); } function showAfterEngineSelection() { } function showCustomerSelection() { $this->showCustomerForm(); } function showResellerSelection() { if ($this->adminonly) { $this->showResellerForm(); } else { printf("%s", $this->reseller); } } function showPagination($maxrows) { $url .= $this->url.'&'.$this->addFiltersToURL().sprintf( "&service=%s&sortBy=%s&sortOrder=%s", urlencode($this->SoapEngine->service), urlencode($this->sorting['sortBy']), urlencode($this->sorting['sortOrder']) ); print "

"); } function showSeachFormCustom() { } function showSeachForm() { if ($this->hide_html()) { return; } printf( "

%s", $this->SoapEngine->ports[$this->SoapEngine->port]['description'] ); printf( "

", $_SERVER['PHP_SELF'] ); //print " // //"; print(""); $this->showEngineSelection(); $this->showAfterEngineSelection(); print("
Order by"); $this->showSortForm(); print("
"); $this->printHiddenFormElements('skipServiceElement'); print("

"); print("
"); $this->showTextBeforeCustomerSelection(); print(""); $this->showCustomerSelection(); $this->showResellerSelection(); print("
"); $this->showSeachFormCustom(); print("
"); if ($_REQUEST['action'] != 'Delete') $this->showAddForm(); } function listRecords() { } function getRecordKeys() { } function addRecord($dictionary = array()) { } function deleteRecord($dictionary = array()) { } function showSortCaret($sortSearch) { if ($this->sorting['sortBy'] == $sortSearch && $this->sorting['sortOrder'] == 'DESC') { print(''); } else if ($this->sorting['sortBy'] == $sortSearch && $this->sorting['sortOrder'] == 'ASC') { print(''); } } function tel2enum($tel, $tld) { if (strlen($tld) == 0) $tld="e164.arpa"; // transform telephone number in FQDN Enum style domain name if (preg_match("/^[+]?(\d+)$/", $tel, $m)) { $l = strlen($m[1]); $rev_num = ""; $z = 0; while ($z < $l) { $ss = substr($m[1], $z, 1); $enum = $ss.".".$enum; $z++; } preg_match("/^(.*)\.$/", $enum, $m); $enum = $m[1]; $enum = $enum.".$tld."; return($enum); } else { return($tel); } } function showAddForm() { if ($this->selectionActive) return; } function showSortForm() { if (!count($this->sortElements)) { return; } $selected_sortBy[$this->sorting['sortBy']]='selected'; print ""); $selected_sortOrder[$this->sorting['sortOrder']]='selected'; print(""); } function showTimezones($timezone) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } print ""; fclose($fp); } function printHiddenFormElements($skipServiceElement = '') { if (!$skipServiceElement) { printf("", $this->SoapEngine->service); } if ($this->adminonly) { printf("", $this->adminonly); } foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; printf( "\n", $element, $this->SoapEngine->extraFormElements[$element] ); } } function getAllowedDomains() { } function showActionsForm() { if (!$this->selectionActive) { return; } $class_name = get_class($this).'Actions'; if (class_exists($class_name)) { $actions = new $class_name($this->SoapEngine, $this->login_credentials); $actions->showActionsForm($this->filters, $this->sorting); } } function executeActions() { $this->showSeachForm(); $this->getRecordKeys(); dprint_r($this->selectionKeys); $class_name=get_class($this).'Actions'; if (class_exists($class_name)) { $actions=new $class_name($this->SoapEngine, $this->login_credentials); $actions->execute( $this->selectionKeys, $_REQUEST['sub_action'], trim($_REQUEST['sub_action_parameter']) ); } } function getCustomers() { if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$this->filters['reseller']) return; // Filter $filter = array('reseller'=>intval($this->filters['reseller'])); $range = array( 'start' => 0, 'count' => 100 ); // Order $orderBy = array( 'attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { if ($result->total > $range['count']) return; if ($range['count'] <= $result->total) { $max = $range['count']; } else { $max = $result->total; } $i = 0; while ($i < $max) { $customer = $result->accounts[$i]; $this->customers[$customer->id] = $customer->firstName.' '.$customer->lastName; $i++; } return true; } } function getResellers() { if (!$this->SoapEngine->customer_engine) { dprint("No customer_engine available"); return true; } if (!$this->adminonly) return; // Filter $filter = array('reseller'=>intval($this->filters['reseller'])); $range = array( 'start' => 0, 'count' => 200 ); // Order $orderBy = array( 'attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { //if ($result->total > $range['count']) return; if ($range['count'] <= $result->total) { $max = $range['count']; } else { $max = $result->total; } $i = 0; while ($i < $max) { $reseller = $result->accounts[$i]; if (strlen($reseller->organization) && $reseller->organization!= 'N/A') { $this->resellers[$reseller->id] = $reseller->organization; } else { $this->resellers[$reseller->id] = $reseller->firstName.' '.$reseller->lastName; } $i++; } dprint_r($this->resellers); return true; } } function getLoginAccount() { if (!$this->SoapEngine->customer_engine) { dprint("No customer_engine available"); return true; } if (!$this->customer) { //print ("No customer available"); return true; } $filter = array('customer'=>intval($this->customer)); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer','direction' => 'ASC'); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { $this->loginAccount = $result->accounts[0]; $this->loginImpersonate = $result->accounts[0]->impersonate; $this->loginProperties = $this->loginAccount->properties; } if ($this->loginAccount->reseller == $this->customer) { $this->resellerProperties = $this->loginProperties; } else { $filter = array('customer' => intval($this->loginAccount->reseller)); $range = array('start' => 0, 'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { $this->resellerProperties=$result->accounts[0]->properties; } } //dprint_r($this->resellerProperties); } function showCustomerForm($name = 'customer_filter') { if ($this->login_credentials['customer'] != $this->login_credentials['reseller']) { printf(" %s ",$this->login_credentials['customer']); } else { if (count($this->customers)) { $select_customer[$this->filters['customer']]='selected'; printf(""); } else { printf( "", $name, $this->filters['customer'] ); } } } function showResellerForm($name = 'reseller_filter') { if (!$this->adminonly) return; if ($this->login_credentials['reseller']) { printf(" %s ",$this->login_credentials['reseller']); } else { if (count($this->resellers)) { $select_reseller[$this->filters['reseller']]='selected'; printf(""); } else { printf( "", $name, $this->filters['reseller'] ); } } } function showTextBeforeCustomerSelection() { print _("Owner"); } function addFiltersToURL() { $url = ''; $j=0; foreach(array_keys($this->filters) as $filter) { if (strlen(trim($this->filters[$filter]))) { if ($j) $url .='&'; $url .= sprintf('%s_filter=%s',$filter,urlencode(trim($this->filters[$filter]))); } $j++; } return $url; } function printFiltersToForm() { foreach(array_keys($this->filters) as $filter) { if (strlen(trim($this->filters[$filter]))) { printf("",$filter,trim($this->filters[$filter])); } } } function getRecord($domain) { } function updateRecord () { } function copyRecord () { } function showRecord($record) { } function RandomString($len=11) { $alf=array("a","b","c","d","e","f", "h","i","j","k","l","m", "n","p","r","s","t","w", "x","y","1","2","3","4", "5","6","7","8","9"); $i=0; while($i < $len) { srand((double)microtime()*1000000); $randval = rand(0,28); $string="$string"."$alf[$randval]"; $i++; } return $string; } function RandomNumber($len=5) { $alf=array("0","1","2","3","4","5", "9","8","7","6"); $i=0; while($i < $len) { srand((double)microtime()*1000000); $randval = rand(0,9); $string="$string"."$alf[$randval]"; $i++; } return $string; } function validDomain($domain) { if (!preg_match ("/^[A-Za-z0-9-.]{1,}\.[A-Za-z]{2,}$/",$domain)) { return false; } return true; } function getCarriers () { if (count($this->carriers)) return true; $Query=array('filter' => array('name'=>''), 'orderBy' => array('attribute' => 'name', 'direction' => 'ASC' ), 'range' => array('start' => 0, 'count' => 1000) ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->carriers as $_carrier) { $this->carriers[$_carrier->id]=$_carrier->name; } } } function getGateways () { if (count($this->gateways)) return true; $Query=array('filter' => array('name'=>''), 'orderBy' => array('attribute' => 'name', 'direction' => 'ASC' ), 'range' => array('start' => 0, 'count' => 1000) ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->gateways as $_gateway) { $this->gateways[$_gateway->id]=sprintf("%s, Carrier %s",$_gateway->name,$_gateway->carrier); } } } function updateBefore () { return true; } function updateAfter () { return true; } function showCustomerTextBox () { print "
Owner"; if ($this->adminonly) { $this->showCustomerForm('customer'); print "
"; $this->showResellerForm('reseller'); print "
"; } else { $this->showCustomerForm('customer'); } } function makebar($w) { $return = "
"; if ($w < 0) $w = 0; if ($w > 100) $w = 100; $width = $w; $extra = 100 - $w; if ($width < 50) { $color = "black"; $return .= "
"; } else if ($width < 70) { $return .= "
"; } else { $return .= "
"; } $return .="
"; return $return; } function customerFromLogin($dictionary=array()) { if ($this->login_credentials['reseller']) { $reseller = $this->login_credentials['reseller']; if ($dictionary['customer']) { $customer = $dictionary['customer']; } else if ($_REQUEST['customer']) { $customer = $_REQUEST['customer']; } else { $customer = $this->login_credentials['customer']; } } else { if ($dictionary['reseller']) { $reseller = $dictionary['reseller']; } else { $reseller = trim($_REQUEST['reseller']); } if ($dictionary['customer']) { $customer = $dictionary['customer']; } else { $customer = trim($_REQUEST['customer']); } } if (!$customer) $customer = $reseller; return array(intval($customer),intval($reseller)); } function getCustomerProperties($customer='') { if (!$customer) $customer=$this->customer; $log=sprintf("getCustomerProperties(%s,engine=%s)",$customer,$this->SoapEngine->customer_engine); dprint($log); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$customer) { dprint ("No customer available"); return true; } $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getProperties'); $result = $this->SoapEngine->soapclientCustomers->getProperties(intval($customer)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->loginProperties=$result; } /* print "
";
         print_r($this->loginProperties);
         print "
"; */ return true; } function setCustomerProperties($properties,$customer='') { if (!$customer) $customer=$this->customer; $log=sprintf("setCustomerProperties(%s,engine=%s)",$customer,$this->SoapEngine->customer_engine); dprint($log); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!is_array($properties) || !$customer) return true; $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('setProperties'); $result = $this->SoapEngine->soapclientCustomers->setProperties(intval($customer),$properties); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } return true; } function getCustomerProperty($name='') { if (!count($this->loginProperties)) return false; foreach ($this->loginProperties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function getResellerProperty($name='') { if (!count($this->resellerProperties)) return false; foreach ($this->resellerProperties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function checkRecord() { return true; } function showWelcomeMessage() { if (!strlen($this->SoapEngine->welcome_message)) return ; printf ("%s",$this->SoapEngine->welcome_message); } function print_w($obj) { print "
\n";
         print_r($obj);
         print "
\n"; } function hide_html() { return false; } } class SipDomains extends Records { var $FieldsAdminOnly=array( 'reseller' => array('type'=>'integer'), ); var $Fields=array( 'customer' => array('type'=>'integer') ); function SipDomains($SoapEngine) { dprint("init Domains"); $this->filters = array( 'domain' => strtolower(trim($_REQUEST['domain_filter'])) ); $this->Records($SoapEngine); // keep default maxrowsperpage $this->sortElements=array('changeDate' => 'Change date', 'domain' => 'Domain' ); } function listRecords() { $this->showSeachForm(); // Filter $filter=array( 'domain' => $this->filters['domain'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); dprint_r($Query); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); // Call function $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($_REQUEST['action'] == 'Export' and $this->rows) { $this->exportDomain($result->domains[0]->domain); return; } if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "
$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->domains[$i]) break; $domain = $result->domains[$i]; $index = $this->next+$i+1; $delete_url = $this->url.sprintf("&service=%s&action=Delete&domain_filter=%s", urlencode($this->SoapEngine->service), urlencode($domain->domain) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['domain_filter'] == $domain->domain) { $delete_url .= "&confirm=1"; $deleteText = "Confirm"; } else { $deleteText = "Delete"; } if ($_REQUEST['action'] == 'Delete' && $_REQUEST['domain_filter'] == $domain->domain) { $delete_url .= "&confirm=1"; $deleteText = "Confirm"; } else { $deleteText = "Delete"; } $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($domain->customer) ); $_sip_domains_url = $this->url.sprintf("&service=sip_domains@%s&domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($domain->domain) ); $_sip_accounts_url = $this->url.sprintf("&service=sip_accounts@%s&domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($domain->domain) ); $_sip_aliases_url = $this->url.sprintf("&service=sip_aliases@%s&alias_domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($domain->domain) ); if ($this->adminonly) { $export_url = $this->url.sprintf("&service=%s&action=Export&domain_filter=%s", urlencode($this->SoapEngine->service), urlencode($domain->domain) ); printf(" ", $index, $_customer_url, $domain->customer, $domain->reseller, $_sip_domains_url, $domain->domain, $_sip_accounts_url, $_sip_aliases_url, $domain->changeDate, $delete_url, $deleteText, $export_url ); } else { printf(" ", $index, $_customer_url, $domain->customer, $domain->reseller, $_sip_domains_url, $domain->domain, $_sip_accounts_url, $_sip_aliases_url, $domain->changeDate, $delete_url, $deleteText ); } $i++; } } print "
Id Owner SIP domain Change date Actions
%s %s.%s %s Sip accounts Sip aliases %s %s Export
%s %s.%s %s Sip accounts Sip aliases %s %s
"; if ($this->rows == 1) { $this->showRecord($domain); } else { $this->showPagination($maxrows); } return true; } } function showSeachFormCustom() { printf ("

SIP domain
",$this->filters['domain']); } function exportRecord($dictionary=array()) { } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['domain']) { $domain=$dictionary['domain']; } else { $domain=$this->filters['domain']; } if (!strlen($domain)) { print "

Error: missing SIP domain. "; return false; } $function=array('commit' => array('name' => 'deleteDomain', 'parameters' => array($domain), 'logs' => array('success' => sprintf('SIP domain %s has been deleted',$domain)) ) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showAddForm() { if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
SIP domain
"); $this->printHiddenFormElements(); printf (" Import SIP domain from file:
Select file Change Remove
" ); print "
"; } function addRecord($dictionary=array()) { if ($this->adminonly && $_FILES['import_file']['tmp_name']) { $content=fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']); //print_r($content); if (!$imported_data=json_decode($content, true)) { printf ("

Error: reading imported data. "); return false; } //print_r($imported_data); if (!in_array('sip_domains', array_keys($imported_data))) { printf ("

Error: Missing SIP domains in imported data. "); return false; } if (!in_array('sip_accounts', array_keys($imported_data))) { return false; printf ("

Error: Missing SIP accounts in imported data. "); } foreach($imported_data['customers'] as $customer) { // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addAccount'); $customer['credit'] = floatval($customer['credit']); $customer['balance'] = floatval($customer['balance']); // Call function $result = $this->SoapEngine->soapclientCustomers->addAccount($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 5001) { $result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } else { printf('

Customer %s has been updated',$customer['id']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } } else { printf('

Customer %s has been added',$customer['id']); } } foreach($imported_data['sip_domains'] as $domain) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addDomain'); $result = $this->SoapEngine->soapclient->addDomain($domain); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 1001) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateDomain'); $result = $this->SoapEngine->soapclient->updateDomain($domain); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } else { printf('

SIP domain %s has been updated',$domain['domain']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } } else { printf('

SIP domain %s has been added',$domain['domain']); } } $i = 0; $added = 0; $updated = 0; $failed = 0; foreach($imported_data['sip_accounts'] as $account) { $i+=1; flush(); $account['callLimit'] = intval($account['callLimit']); $account['prepaid'] = intval($account['prepaid']); $account['quota'] = intval($account['quota']); $account['owner'] = intval($account['owner']); $account['timeout'] = intval($account['timeout']); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addAccount'); $result = $this->SoapEngine->soapclient->addAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 1011) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $result = $this->SoapEngine->soapclient->updateAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); $failed += 1; } else { printf('

%d SIP account %s@%s has been updated',$i,$account['id']['username'], $account['id']['domain']); $updated += 1; } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); $failed += 1; } } else { printf('

%d SIP account %s@%s has been added',$i, $account['id']['username'], $account['id']['domain']); $added += 1; } } if ($added) { printf('

%d SIP accounts added',$added); } if ($updated ) { printf('

%d SIP accounts updated',$updated); } if ($failed) { printf('

%d SIP accounts failed',$failed); } $added = 0; foreach($imported_data['sip_aliases'] as $alias) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addAlias'); $result = $this->SoapEngine->soapclient->addAlias($alias); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } else { $added += 1; } } if ($added) { printf('

%d SIP aliases added',$added); } return true; } else { if ($dictionary['domain']) { $domain = $dictionary['domain']; } else { $domain = trim($_REQUEST['domain']); } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!$this->validDomain($domain)) { print "Error: invalid domain name"; return false; } $domainStructure = array('domain' => strtolower($domain), 'customer' => intval($customer), 'reseller' => intval($reseller) ); $function=array('commit' => array('name' => 'addDomain', 'parameters' => array($domainStructure), 'logs' => array('success' => sprintf('SIP domain %s has been added',$domain))) ); return $this->SoapEngine->execute($function,$this->html); } } function getRecordKeys() { // Filter $filter=array( 'domain' => $this->filters['domain'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error in getAllowedDomains from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); //return false; } else { foreach ($result->domains as $_domain) { $this->selectionKeys[]=$_domain->domain; } } } function getRecord($domain) { // Filter $filter=array( 'domain' => $domain ); // Range $range=array('start' => 0, 'count' => 1 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); dprint_r($Query); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); // Call function $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->domains[0]){ return $result->domains[0]; } else { return false; } } } function showRecord($domain) { print ""; print " "; } print " "; $this->showHeader(); $this->chapterTableStart(); $this->showAboveTabs(); $this->showTabs(); $this->showUnderTabs(); $this->showTitleBar(); if (!array_key_exists($this->tab,$this->tabs)) $this->tab="settings"; // show tab $tabFunctionName='show'.ucfirst($this->tab).'Tab'; $this->$tabFunctionName(); $this->showFooter(); $this->chapterTableStop(); } function getDomainOwner ($domain='') { dprint("getdomainOwner($domain)"); if (!$domain) return; // Filter $filter=array('domain' => $domain); // Range $range=array('start' => 0, 'count' => 1 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); //dprint_r($Query); // Call function $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { if ($result->domains[0]) { $this->reseller = $result->domains[0]->reseller; $this->customer = $result->domains[0]->customer; } } } function getMobileNumber() { //dprint('getMobileNumber()'); $this->mobile_number=''; if ($this->Preferences['mobile_number']) { $this->mobile_number=$this->Preferences['mobile_number']; } else if ($this->owner_information['mobile']) { $this->mobile_number=$this->owner_information['mobile']; } } function setLanguage() { dprint("setLanguage()"); if ($this->login_type == 'reseller' || $this->login_type == 'customer') { $lang = $this->ResellerLanguage; } else if ($this->login_type == 'subscriber') { if (!$this->Preferences['language']) { foreach (array_keys($this->languages) as $_lang) { if ($this->languages[$_lang]['timezone'] == $this->timezone) { $lang=$_lang; break; } } } $lang = $this->Preferences['language']; } else { $lang = "en"; } //print("Set language to $lang"); $this->changeLanguage($lang); } function getOwnerSettings($owner='') { dprint("getOwnerSettings($owner)"); if (!$owner) { return false; } $this->CustomerPort->addHeader($this->SoapAuthCustomer); $result = $this->CustomerPort->getAccount($owner); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->owner_information=array( "username" => $result->username, "password" => $result->password, "firstName" => $result->firstName, "lastName" => $result->lastName, "organization" => $result->organization, "timezone" => $result->timezone, "address" => $result->address, "billingAddress" => $result->billingAddress, "city" => $result->city, "state" => $result->state, "country" => $result->country, "postcode" => $result->postcode, "tel" => $result->tel, "enum" => $result->enum, "mobile" => $result->mobile, "fax" => $result->fax, "email" => $result->email, "web" => $result->web ); //dprint_r($this->owner_information); } function getAliases() { // Get Aliases dprint("getAliases()"); $this->aliases=array(); $this->SipPort->addHeader($this->SoapAuth); // Filter $filter=array('targetUsername' => $this->username, 'targetDomain' => $this->domain ); // Range $range=array('start' => 0, 'count' => 20 ); // Order $orderBy = array('attribute' => 'aliasUsername', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $result = $this->SipPort->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } //dprint_r($result); foreach ($result->aliases as $_alias) { $this->aliases[]=$_alias->id->username.'@'.$_alias->id->domain; } } function getRatingEntityProfiles() { dprint("getRatingEntityProfiles()"); $this->EntityProfiles=array(); $this->RatingPort->addHeader($this->SoapAuthRating); $entity="subscriber://".$this->username."@".$this->domain; $result = $this->RatingPort->getEntityProfiles($entiry); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (RatingPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->EntityProfiles=$result; } function setAliases() { dprint("setAliases()"); $aliases_new=$_REQUEST['aliases']; $this->getAliases(); $aliases_old=$this->aliases; $addAliases = array_unique(array_diff($aliases_new,$aliases_old)); $deleteAliases = array_unique(array_diff($aliases_old,$aliases_new)); foreach ($addAliases as $_alias) { $_alias=trim(strtolower($_alias)); if (!preg_match("/^[a-z0-9-_.@]+$/i",$_alias)) continue; $els=explode("@",$_alias); if (count($els) ==1 ) { $_alias_username=$_alias; $_alias_domain=$this->domain; } else if (count($els) ==2) { $_alias_username=$els[0]; $_alias_domain=$this->domain; } else { continue ; } $_aliasObject=array("id"=>array("username"=>strtolower($_alias_username), "domain"=>strtolower($_alias_domain) ), "owner"=>intval($this->owner), "target"=>$this->sipId ) ; $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addAlias($_aliasObject); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } foreach ($deleteAliases as $_alias) { $_alias=trim($_alias); if (!strlen($_alias)) continue; $els=explode("@",$_alias); if (count($els) ==1 ) { $_alias_username=$_alias; $_alias_domain=$this->domain; } else if (count($els) == 2) { $_alias_username=$els[0]; $_alias_domain=$els[1]; } else { continue ; } $_aliasObject=array("username"=>$_alias_username, "domain" =>$_alias_domain ); dprint_r($_aliasObject); dprint("deleteAlias"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->deleteAlias($_aliasObject); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } unset($this->aliases); } function getVoicemail () { dprint("getVoicemail()"); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->getAccount($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") { printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return true; } } if (!$result->mailbox) { dprint ("No voicemail account found"); return false; } $this->voicemail['Mailbox'] = $result->mailbox; $this->voicemail['Password'] = $result->password; $this->voicemail['Name'] = $result->name; $this->voicemail['Email'] = $result->email; $this->voicemail['Info'] = $result->info; $this->voicemail['Options'] = $result->options; $this->voicemail['Account'] = $result->mailbox.'@'.$this->voicemail_server; // used by template system $this->voicemailMailbox = $result->mailbox; //dprint_r($this->voicemail); return true; } function showTitleBar() { print "

"; printf (("%s <sip:%s@%s>"),$this->fullName,$this->username,$this->domain); print " "; if ($this->login_type == 'subscriber' && !$this->isEmbedded()) { print ""; print _("Logout"); print ""; } else { if ($this->enable_thor) { print " "; if ($this->isEmbedded()) { print " "; print _("Home Node"); } else { print ""; print _("SIP Thor Node"); print ""; } if ($this->homeNode=getSipThorHomeNode($this->account,$this->sip_proxy)) { printf (" %s",$this->homeNode); } else { print " "; print _("Unknown"); print ""; } } } print "
"; } function getDivertTargets () { dprint("getDivertTargets()"); $this->divertTargets[] = array("name" => _("No diversion"), "value" => "", "description" => "Disabled" ); if ($this->voicemail['Account']) { $vmf=$this->getVoicemailForwarding(); if (is_array($vmf)) { $this->divertTargets[]=$vmf; } } if ($this->owner) { if (in_array("free-pstn",$this->groups)) { if ($this->owner_information['tel']) { $tel = preg_replace("/[^\d+]/", "", $this->owner_information['tel']); $tel_enum = str_replace("+", "00", $tel); $telf = $tel_enum . "@" . $this->domain; if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) { $this->divertTargets[]=array("name" => sprintf (_("Tel %s"),$tel), "value" => $telf, "description" => "Tel"); } $seen[$tel_enum]++; } if ($this->owner_information['enum']) { $tel = preg_replace("/[^\d+]/", "", $this->owner_information['enum']); $tel_enum = str_replace("+", "00", $tel); $telf = $tel_enum . "@" . $this->domain; if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) { $this->divertTargets[]=array("name" => sprintf (_("Tel %s"),$tel), "value" => $telf, "description" => "ENUM"); } $seen[$tel_enum]++; } } } if ($this->mobile_number) { $tel = preg_replace("/[^\d+]/", "", $this->mobile_number); $tel_enum = str_replace("+", "00", $tel); $telf = $tel_enum . "@" . $this->domain; if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) { $this->divertTargets[] = array("name" => sprintf (_("Mobile %s"),$tel), "value" => $telf, "description" => "Mobile" ); } $seen[$tel_enum]++; } $this->divertTargets[]=array("name" => sprintf (_("Other")), "value" => "", "description" => "Other" ); //print_r($this->divertTargets); } function pstnChangesAllowed() { dprint("pstnChangesAllowed()"); if ($this->login_type == 'subscriber') { $this->pstn_changes_allowed = false; return; } else { if ($this->login_type == 'admin') { $this->pstn_changes_allowed = true; return; // for a reseller we need to check if a subaccount is allowed } else if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) { if ($this->resellerProperties['pstn_changes']) { dprint("is reseller"); $this->pstn_changes_allowed = true; } return; } else if ($this->customerImpersonate == $this->loginCredentials['reseller']) { if ($this->resellerProperties['pstn_changes']) { dprint("impersonate reseller"); $this->pstn_changes_allowed = true; } return; } else if ($this->resellerProperties['pstn_changes'] && $this->customerProperties['pstn_changes']) { $this->pstn_changes_allowed = true; return; } } $this->pstn_changes_allowed = false; return; } function smsChangesAllowed() { dprint("smsChangesAllowed()"); if ($this->login_type == 'subscriber') { $this->sms_changes_allowed = false; return; } else { // for a reseller we need to check if a subaccount is allowed if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) { if ($this->resellerProperties['sms_access']) { dprint("is reseller"); $this->sms_changes_allowed = true; } return; } else if ($this->customerImpersonate == $this->loginCredentials['reseller']) { if ($this->resellerProperties['sms_access']) { dprint("impersonate reseller"); $this->sms_changes_allowed = true; } return; } else if ($this->resellerProperties['sms_access'] && $this->customerProperties['sms_access']) { $this->sms_changes_allowed = true; return; } } $this->sms_changes_allowed = false; return; } function prepaidChangesAllowed() { dprint("prepaidChangesAllowed()"); if ($this->login_type == 'subscriber') { $this->prepaid_changes_allowed = false; return; } else { if ($this->login_type == 'admin') { $this->prepaid_changes_allowed = true; return; // for a reseller we need to check if a subaccount is allowed } else if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) { dprint("is reseller"); if ($this->resellerProperties['prepaid_changes']) { $this->prepaid_changes_allowed = true; } return; } else if ($this->customerImpersonate == $this->loginCredentials['reseller']) { dprint("impersonate reseller"); if ($this->resellerProperties['prepaid_changes']) { $this->prepaid_changes_allowed = true; } return; } else if ($this->resellerProperties['prepaid_changes'] && $this->customerProperties['prepaid_changes']) { $this->prepaid_changes_allowed = true; return; } } $this->prepaid_changes_allowed = false; return; } function getCustomerSettings () { dprint("getCustomerSettings()"); if (!$this->loginCredentials['customer']) return; $id=$this->loginCredentials['customer']; $this->CustomerPort->addHeader($this->SoapAuthCustomer); $result = $this->CustomerPort->getAccount(intval($this->loginCredentials['customer'])); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach ($result->properties as $_property) { $this->customerProperties[$_property->name]=$_property->value; } $this->customerImpersonate=$result->impersonate; //dprint_r($this->customerProperties); } function getResellerSettings () { dprint("getResellerSettings()"); $this->logoFile = $this->getFileTemplate("logo","logo"); $this->headerFile = $this->getFileTemplate("header.phtml"); $this->footerFile = $this->getFileTemplate("footer.phtml"); $this->cssFile = $this->getFileTemplate("main.css"); if (!$this->reseller) { if ($this->pstn_access) { $this->availableGroups['free-pstn'] = array( "Group" => "free-pstn", "WEBName" => sprintf(_("PSTN Access")), "WEBComment" => sprintf(_("Caller-ID")), "SubscriberMayEditIt" => 0, "SubscriberMaySeeIt" => 1, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); if ($this->change_privacy_access_number) { $_comment = sprintf(_("Dial %s to change"), $this->change_privacy_access_number); } else { $_comment = ''; } $this->availableGroups['anonymous'] = array( "Group" => "anonymous", "WEBName" => sprintf (_("PSTN Privacy")), "WEBComment" => $_comment, "SubscriberMaySeeIt" => 1, "SubscriberMayEditIt" => 1, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); if ($this->pstn_access) { $this->availableGroups['rate-on-net'] = array("Group"=>"rate-on-net", "WEBName" =>sprintf(_("Rate on net")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); if ($this->sms_access) { $this->availableGroups['sms'] = array("Group"=>"sms", "WEBName" =>sprintf(_("Mobile SMS")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>1, "ResellerMayEditIt"=>0, "ResellerMaySeeIt"=>1 ); } } if ($this->require_proof_of_identity) { $this->availableGroups['payments'] = array("Group"=>"payments", "WEBName" =>sprintf(_("CC Payments")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); } } return true; } $this->CustomerPort->addHeader($this->SoapAuthCustomer); $result = $this->CustomerPort->getAccount(intval($this->reseller)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach ($result->properties as $_property) { $this->resellerProperties[$_property->name]=$_property->value; } $this->resellerProperties['language'] = $result->language; $this->resellerProperties['timezone'] = $result->timezone; // overwrite settings from soap engine if ($this->resellerProperties['sip_proxy']) { $this->sip_proxy = $this->resellerProperties['sip_proxy']; } if ($this->resellerProperties['sip_outbound_proxy']) { $this->sip_outbound_proxy = $this->resellerProperties['sip_outbound_proxy']; } if ($this->resellerProperties['push_notifications_server']) { $this->sip_mobile_outbound_proxy = $this->resellerProperties['push_notifications_server']; } if (!$this->sip_outbound_proxy) { $this->sip_outbound_proxy = $this->sip_proxy; } if (!$this->sip_mobile_outbound_proxy) { $this->sip_mobile_outbound_proxy = $this->sip_outbound_proxy; } if ($this->resellerProperties['store_clear_text_passwords']) { $this->store_clear_text_passwords = $this->resellerProperties['store_clear_text_passwords']; } if ($this->resellerProperties['support_company']) { $this->support_company = $this->resellerProperties['support_company']; } if ($this->resellerProperties['support_web']) { $this->support_web = $this->resellerProperties['support_web']; } if ($this->resellerProperties['support_email']) { $this->support_email = $this->resellerProperties['support_email']; } if ($this->resellerProperties['billing_email']) { $this->billing_email = $this->resellerProperties['billing_email']; } if (!$this->billing_email) { $this->billing_email=$this->support_email; } if ($this->resellerProperties['sip_settings_page']) { $this->sip_settings_page = $this->resellerProperties['sip_settings_page']; } if ($this->resellerProperties['digest_settings_page']) { $this->digest_settings_page = $this->resellerProperties['digest_settings_page']; } if ($this->resellerProperties['xcap_root']) { $this->xcap_root = rtrim($this->resellerProperties['xcap_root'],'/'); if ($this->append_domain_to_xcap_root) { $this->xcap_root .= "@".$this->domain."/"; } } if ($this->resellerProperties['cdrtool_address']) { $this->cdrtool_address = $this->resellerProperties['cdrtool_address']; } if ($this->resellerProperties['msrp_relay']) { $this->msrp_relay = $this->resellerProperties['msrp_relay']; } if (isset($this->resellerProperties['voicemail_server'])) { $this->voicemail_server = $this->resellerProperties['voicemail_server']; } if (isset($this->resellerProperties['voicemail_access_number'])) { $this->voicemail_access_number = $this->resellerProperties['voicemail_access_number']; } if (isset($this->resellerProperties['currency'])) { $this->currency = $this->resellerProperties['currency']; } if (isset($this->resellerProperties['FUNC_access_number'])) { $this->FUNC_access_number = $this->resellerProperties['FUNC_access_number']; } if (isset($this->resellerProperties['FNOA_access_number'])) { $this->FNOA_access_number = $this->resellerProperties['FNOA_access_number']; } if (isset($this->resellerProperties['FBUS_access_number'])) { $this->FBUS_access_number = $this->resellerProperties['FBUS_access_number']; } if (isset($this->resellerProperties['FNOL_access_number'])) { $this->FNOL_access_number = $this->resellerProperties['FNOL_access_number']; } if (isset($this->resellerProperties['payment_processor_class'])) { $this->payment_processor_class = $this->resellerProperties['payment_processor_class']; } if (isset($this->resellerProperties['change_privacy_access_number'])) { $this->change_privacy_access_number = $this->resellerProperties['change_privacy_access_number']; } if (isset($this->resellerProperties['check_privacy_access_number'])) { $this->check_privacy_access_number = $this->resellerProperties['check_privacy_access_number']; } if (isset($this->resellerProperties['reject_anonymous_access_number'])) { $this->reject_anonymous_access_number = $this->resellerProperties['reject_anonymous_access_number']; } if (isset($this->resellerProperties['absolute_voicemail_uri'])) { $this->absolute_voicemail_uri = $this->resellerProperties['absolute_voicemail_uri']; } if (isset($this->resellerProperties['pstn_access'])) { $this->pstn_access = $this->resellerProperties['pstn_access']; } if (isset($this->resellerProperties['sms_access'])) { $this->sms_access = $this->resellerProperties['sms_access']; } if ($this->pstn_access) { $this->availableGroups['free-pstn'] = array("Group"=>"free-pstn", "WEBName" => sprintf(_("PSTN Access")), "WEBComment"=> sprintf(_("Caller-ID")), "SubscriberMayEditIt" => "0", "SubscriberMaySeeIt" => 1, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); if ($this->change_privacy_access_number) { $_comment = sprintf(_("Dial %s to change"), $this->change_privacy_access_number); } else { $_comment = ''; } $this->availableGroups['anonymous'] = array( "Group" => "anonymous", "WEBName" => sprintf (_("PSTN Privacy")), "WEBComment" => $_comment, "SubscriberMaySeeIt" => 1, "SubscriberMayEditIt" => 1, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); $this->availableGroups['rate-on-net'] = array( "Group" => "rate-on-net", "WEBName" => sprintf(_("Rate on net")), "SubscriberMayEditIt" => 0, "SubscriberMaySeeIt" => 0, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); if ($this->sms_access) { $this->availableGroups['sms'] = array("Group"=>"sms", "WEBName" =>sprintf(_("Mobile SMS")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>1, "ResellerMayEditIt"=>0, "ResellerMaySeeIt"=>1 ); } } } function getDiversions() { dprint("getDiversions()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCallDiversions($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } //print_r($result); reset($this->diversionType); foreach(array_keys($this->diversionType) as $condition) { $uri=$result->$condition; if (($uri == "" || $uri == "voice-mailbox") && $this->absolute_voicemail_uri) { $uri = $this->voicemail['Account']; } else if ($uri == "voice-mailbox") { $uri = ""; } if (preg_match("/^(sip:|sips:)(.*)$/i",$uri,$m)) { $uri=$m[2]; } $this->diversions[$condition]=$uri; } //print_r($this->diversions); } function getDeviceLocations() { dprint("getDeviceLocations()"); require_once($this->SipUAImagesFile); $this->userAgentImages = $userAgentImages; $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getSipDeviceLocations(array($this->sipId)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { foreach ($result[0]->locations as $locationStructure) { $contact=$locationStructure->address.":".$locationStructure->port; if ($locationStructure->publicAddress) { $publicContact=$locationStructure->publicAddress.":".$locationStructure->publicPort; } else { $publicContact=$contact; } $this->locations[]=array("contact" => $contact, "publicContact" => $publicContact, "expires" => $locationStructure->expires, "user_agent" => $locationStructure->userAgent, "transport" => $locationStructure->transport ); } } } function getVoicemailForwarding () { dprint("getVoicemailForwarding()"); if (!$this->voicemail['Account']) { return; } if ($this->absolute_voicemail_uri) { $value=$this->voicemail['Account']; } else { $value=""; } return array("name" => sprintf (_("Voice Mailbox")), "value" => $value, "description" => "Voicemail"); } function showAboveTabs() { print "

"; print "
"; } function showTabs() { print "
"; if ($this->isEmbedded()) { print $this->embedded_img;; } print "
    "; $items=0; while (list($k,$v)= each($this->tabs)) { if ($this->tab==$k) { $_class='active selected_tab'; } else { $_class='tabs'; } print "
  • $v
  • "; } print "
"; print "
"; } function showUnderTabs() { print "
"; print "
"; } function addInvoice($cardProcessor) { // called after CC payment sucessfull } function showPaymentsTab() { if (!$this->show_payments_tab) { return false; } if ($this->login_type == 'subscriber' && in_array("blocked",$this->groups)) { return false; } if ($_REQUEST['task'] == 'showprices') { $chapter=sprintf(_("Price list")); $this->showChapter($chapter); include($this->pstn_termination_price_page); return true; } $chapter=sprintf(_("Payments")); $this->showChapter($chapter); if (!$this->owner) { print " "; return false; } $this->getBalanceHistory(); $today_summary = $this->getTodayBalanceSummary(); if ($today_summary['credit'] >= $this->max_credit_per_day) { print " "; return false; } if (!count($this->balance_history)) { $this->first_transaction=true; } else { $this->first_transaction=false; } print " "; $credit_amount = 20; //$method = 'btc'; if ($method == 'btc') { print "

Select an amount and click submit to go the Bitcoin payment page."; printf("
Amount USD

", $this->account); } else { $chapter=sprintf(_("Credit Card")); $this->showChapter($chapter); if ($this->require_proof_of_identity) { if ($this->login_type == 'subscriber') { if (!in_array("payments",$this->groups)) { $this->showIdentityProof(); } } else { $this->showIdentityProof(); } if (!in_array("payments",$this->groups)) { return false; } } $payment_processor = new $this->payment_processor_class($this); if ($payment_processor->fraudDetected()) { $chapter=sprintf(_("Payments")); $this->showChapter($chapter); print "

"; return false; } $basket = array('pstn_credit'=>array('price' => $credit_amount, 'description' => _('Prepaid Credit'), 'unit' => 'credit', 'duration' => 'N/A', 'qty' => 1 ) ); // print "
";
            // print_r($payment_processor);
            // print "
"; $payment_processor->doDirectPayment($basket); //print "
";
             //
             //print_r($payment_processor);
             //print "
"; if ($payment_processor->transaction_results['success']) { // add PSTN credit $this->addBalanceReseller($credit_amount,sprintf("CC transaction %s",$payment_processor->transaction_results['id'])); } if ($this->first_transaction && $payment_processor->make_credit_checks) { // block account temporary to check the user // $transaction_data= $payment_processor->['CardProcessor']['transaction_data']; // if ( $this->email != $transaction_data['USER_EMAIL'] || // $this-> $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->removeFromGroup(array("username" => $this->username,"domain"=> $this->domain),"free-pstn"); } } } function showIdentityProof () { $max_file_size=1024000; $this->db = new DB_CDRTool(); $chapter=sprintf(_("Proof of Identity")); $this->showChapter($chapter); if ($_REQUEST['task'] == 'upload') { if (!$_FILES['tmpfile']['tmp_name']) { print ""; printf (_("Error: Please specify a file")); print ""; } else if (!$_REQUEST['name']) { print ""; printf (_("Error: Please enter the name printed on the Credit Card")); print ""; } else if (!preg_match("/^\d{4}$/",$_REQUEST['last_digits'])) { print ""; printf (_("Error: Last digits must be numeric")); print ""; } else if (!preg_match("/^\+[1-9][0-9]{7,14}$/",$_REQUEST['mobile_number'])) { print ""; printf (_("Error: Mobile Number must be in international format starting with +")); print ""; } else if ($_FILES['tmpfile']['size']['size'] > $max_file_size) { print ""; printf (_("Error: Maximum file size is %s"),$max_file_size); print ""; } else { $fp=fopen($_FILES['tmpfile']['tmp_name'], "r"); $content=fread($fp, $_FILES['tmpfile']['size']); fclose($fp); $query=sprintf("insert into subscriber_docs ( `name`, `username`, `domain`, `document`, `file_content`, `file_name`, `file_size`, `file_type`, `file_date`, `last_digits`, `mobile_number` ) values ( '%s', '%s', '%s', 'identity', '%s', '%s', '%s', '%s', NOW(), '%s', '%s' )", addslashes($_REQUEST['name']), addslashes($this->username), addslashes($this->domain), addslashes($content), addslashes($_FILES['tmpfile']['name']), addslashes($_FILES['tmpfile']['size']), addslashes($_FILES['tmpfile']['type']), addslashes($_REQUEST['last_digits']), addslashes($_REQUEST['mobile_number']) ); if (!$this->db->query($query)) { print ""; printf ("Error: Failed to save identity document %s (%s)", $this->db->Error,$this->db->Errno); print ""; } // send mail include_once('Mail.php'); include_once('Mail/mime.php'); $subject=sprintf ("%s requested CC Payments",$this->account); $hdrs = array( 'From' => $this->email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setTXTBody($subject); $mime->setHTMLBody($subject); $mime->addAttachment($content, $_FILES['tmpfile']['type'],$_FILES['tmpfile']['name'],'false'); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); $mail->send($this->billing_email, $hdrs, $body); } } if ($this->login_type != 'subscriber' && $_REQUEST['task'] == 'delete_identity_proof' && $_REQUEST['confirm']) { $query=sprintf("delete from subscriber_docs where username = '%s' and domain = '%s' and document = 'identity'", addslashes($this->username), addslashes($this->domain) ); if (!$this->db->query($query)) { print ""; printf ("Error deleting record: %s (%s)", $this->db->Error,$this->db->Errno); print ""; } } $query=sprintf("select * from subscriber_docs where username = '%s' and domain = '%s' and document = 'identity'", addslashes($this->username), addslashes($this->domain) ); if (!$this->db->query($query)) { print ""; printf ("Error for database query: %s (%s)", $this->db->Error,$this->db->Errno); print ""; } if ($this->db->num_rows()) { print "
"; printf ("",$_SERVER['PHP_SELF']); print ""; print ""; if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $domain->$item ); } else { printf ("", $item_name, $item, $domain->$item ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $domain->$item ); } else { printf ("", $item_name, $item, $domain->$item ); } } printf ("",$domain->domain); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
%s
%s
%s
%s
"; } function updateRecord () { //print "

Updating domain ..."; if (!$_REQUEST['domain_filter']) return false; if (!$domain = $this->getRecord($_REQUEST['domain_filter'])) { return false; } $domain_old=$domain; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $domain->$item = intval($_REQUEST[$var_name]); } else { $domain->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $domain->$item = intval($_REQUEST[$var_name]); } else { $domain->$item = trim($_REQUEST[$var_name]); } } } $function=array('commit' => array('name' => 'updateDomain', 'parameters' => array($domain), 'logs' => array('success' => sprintf('Domain %s has been updated',$domain->domain))) ); return $this->SoapEngine->execute($function,$this->html); } function hide_html() { if ($_REQUEST['action'] == 'Export') { return true; } else { return false; } } function exportDomain($domain) { $exported_data= array(); // Filter $filter=array( 'domain' => $domain, 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 1000 ); // Compose query $Query=array('filter' => $filter, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $i = 0 ; while ($i < $result->total) { $domain = $result->domains[$i]; if (!in_array($domain->customer, $export_customers)) { $export_customers[]=$domain->customer; } if (!in_array($domain->reseller, $export_customers)) { $export_customers[]=$domain->reseller; } $i+=1; $exported_data['sip_domains'][] = objectToArray($domain); } } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,'getAccounts'),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['sip_accounts'] = objectToArray($result->accounts); foreach ($result->accounts as $account) { if (!in_array($account->owner, $export_customers)) { $export_customers[]=$account->owner; } $sipId=array("username" => $account->id->username, "domain" => $account->id->domain ); $this->SoapEngine->soapclientVoicemail->addHeader($this->SoapEngine->SoapAuthVoicemail); $result = $this->SoapEngine->soapclientVoicemail->getAccount($sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") { printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } } else { $exported_data['voicemail_accounts'][] = $result; } // Filter $filter=array('targetUsername' => $account->id->username, 'targetDomain' => $account->id->domain ); // Range $range=array('start' => 0, 'count' => 20 ); // Compose query $Query=array('filter' => $filter, 'range' => $range ); // Call function $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAliases'); $result = $this->SoapEngine->soapclient->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } else { foreach ($result->aliases as $alias) { $exported_data['sip_aliases'][] = objectToArray($alias); } } } } foreach ($export_customers as $customer) { if (!$customer) { continue; } $filter=array( 'customer' => intval($customer), ); // Compose query $Query=array('filter' => $filter ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['customers'] = objectToArray($result->accounts); } } //print_r($exported_data['customers']); print_r(json_encode($exported_data)); } } class SipAccounts extends Records { var $selectionActiveExceptions=array('domain'); var $sortElements=array('changeDate' => 'Change date', 'username' => 'Username', 'domain' => 'Domain' ); var $store_clear_text_passwords=true; var $default_account_type = 'postpaid'; var $group_filter_list = array('blocked' => 'Blocked', 'quota' => 'Quota Exceeded', 'prepaid' => 'Prepaid', 'free-pstn' => 'PSTN Access', 'anonymous' => 'Anonymous', 'anonymous-reject' => 'Reject Anonymous', 'voicemail' => 'Has Voicemail', 'missed-calls' => 'Missed Calls' ); function SipAccounts($SoapEngine) { dprint("init SipAccounts"); $this->filters = array('username' => strtolower(trim($_REQUEST['username_filter'])), 'domain' => strtolower(trim($_REQUEST['domain_filter'])), 'firstname'=> trim($_REQUEST['firstname_filter']), 'lastname' => trim($_REQUEST['lastname_filter']), 'email' => trim($_REQUEST['email_filter']), 'owner' => trim($_REQUEST['owner_filter']), 'customer' => trim($_REQUEST['customer_filter']), 'reseller' => trim($_REQUEST['reseller_filter']), 'group' => trim($_REQUEST['group_filter']) ); $this->Records($SoapEngine); if (strlen($this->SoapEngine->call_limit)) { $this->platform_call_limit = $this->SoapEngine->call_limit; } else { $this->platform_call_limit; } $this->getTimezones(); } function getRecordKeys() { if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) { $this->filters['username'] = $m[1]; $this->filters['domain'] = $m[2]; } // Filter $filter=array('username' => $this->filters['username'], 'domain' => $this->filters['domain'], 'firstName'=> $this->filters['firstname'], 'lastName' => $this->filters['lastname'], 'email' => $this->filters['email'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']), 'groups' => array($this->filters['group']) ); // Range $range=array('start' => 0, 'count' => 500 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); // Call function $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->accounts as $account) { $this->selectionKeys[]=array('username' => $account->id->username, 'domain' => $account->id->domain ); } return true; } return false; } function listRecords() { $this->getAllowedDomains(); if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) { $this->filters['username'] = $m[1]; $this->filters['domain'] = $m[2]; } $this->showSeachForm(); // Filter $filter=array('username' => $this->filters['username'], 'domain' => $this->filters['domain'], 'firstName'=> $this->filters['firstname'], 'lastName' => $this->filters['lastname'], 'email' => $this->filters['email'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']), 'groups' => array($this->filters['group']) ); $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credentials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); // Call function $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $action != 'PerformActions' && $action != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } if ($this->rows) { $i=0; $_prepaid_accounts=array(); while ($i < $maxrows) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; if ($account->prepaid) { $_prepaid_accounts[]=array("username" => $account->id->username, "domain" => $account->id->domain ); } $i++; } if (count($_prepaid_accounts)) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getPrepaidStatus'); // Call function $result1 = $this->SoapEngine->soapclient->getPrepaidStatus($_prepaid_accounts); if (!(new PEAR)->isError($result1)) { $j=0; foreach ($result1 as $_account) { $_sip_account=sprintf("%s@%s",$_prepaid_accounts[$j]['username'],$_prepaid_accounts[$j]['domain']); $_prepaid_balance[$_sip_account]=$_account->balance; $j++; } } } $i=0; while ($i < $maxrows) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $index=$this->next+$i+1; $_url = $this->url.'&'.$this->addFiltersToURL().sprintf("&service=%s&action=Delete", urlencode($this->SoapEngine->service) ); if (!$this->filters['domain']) { $_url .= sprintf("&domain_filter=%s",urlencode($account->id->domain)); } if (!$this->filters['username']) { $_url .= sprintf("&username_filter=%s",urlencode($account->id->username)); } $_url.= sprintf("&key=%s",urlencode($account->id->username)); if ($action == 'Delete' && $_REQUEST['key'] == $account->id->username && $_REQUEST['domain_filter'] == $account->id->domain) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($account->reseller) { $reseller_sip_settings_page=$account->reseller; } else if ($this->SoapEngine->impersonate) { // use the reseller from the soap engine $reseller_sip_settings_page=$this->SoapEngine->impersonate; } else { // use the reseller from the login $reseller_sip_settings_page=$this->reseller; } if ($this->sip_settings_page) { $url=sprintf('%s?account=%s@%s&sip_engine=%s', $this->sip_settings_page,urlencode($account->id->username),$account->id->domain,$this->SoapEngine->sip_engine); if ($this->adminonly) { $url .= sprintf('&reseller=%s',$reseller_sip_settings_page); $url .= sprintf('&adminonly=%s',$this->adminonly); } else { if ($account->reseller == $this->reseller) $url .= sprintf('&reseller=%s',$reseller_sip_settings_page); } foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; $url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element])); } $sip_account=sprintf(" %s@%s",$url,$account->id->username,$account->id->domain); } else { $sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain); } /* $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($account->customer)); */ if ($account->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($account->owner), $account->owner ); } else { $_owner_url=''; } $prepaid_account=sprintf("%s@%s",$account->id->username,$account->id->domain); if ($account->callLimit) { $callLimit = $account->callLimit; } else if ($this->platform_call_limit) { $callLimit = $this->platform_call_limit; } else { $callLimit = ''; } printf(" ", $index, $sip_account, $account->firstName, $account->lastName, $account->email, $account->email, $account->timezone, $callLimit, $account->quota, $_prepaid_balance[$prepaid_account], $_owner_url, $account->changeDate, $_url, $actionText ); $i++; } } print "
Id SIP account"; $this->showSortCaret('username'); if ($this->sorting['sortBy'] == 'domain' ) { print " (domain "; $this->showSortCaret('domain'); print ")"; } print " Full name Email address Timezone Call limit Quota Balance Owner Change date"; $this->showSortCaret('changeDate'); print " Actions
%s %s %s %s %s %s %s %s %s %s %s %s
"; $this->showPagination($maxrows); return true; } } function showSeachFormCustom() { printf ("

Account
",$this->filters['username']); printf ("@"); if (count($this->allowedDomains) > 0) { if ($this->filters['domain'] && !in_array($this->filters['domain'],$this->allowedDomains)) { printf ("",$this->filters['domain']); } else { $selected_domain[$this->filters['domain']]='selected'; printf ("\n"); } } else { printf ("",$this->filters['domain']); } printf ("
FN
\n",$this->filters['firstname']); printf ("
LN
\n",$this->filters['lastname']); printf ("
Email
\n",$this->filters['email']); printf ("
Owner
\n",$this->filters['owner']); $selected_group[$this->filters['group']]='selected'; print ""; } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['username']) { $username=$dictionary['username']; } else { $username=$_REQUEST['key']; } if ($dictionary['domain']) { $domain=$dictionary['domain']; } else { $domain=$this->filters['domain']; } if (!strlen($username) || !strlen($domain)) { print "

Error: missing SIP account username or domain. "; return false; } $account=array('username' => $username, 'domain' => $domain ); $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array($account), 'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$_REQUEST['key'],$this->filters['domain']) ) ) ); foreach (array_keys($this->filters) as $_filter) { if ($_filter == 'username' || $_filter == 'domain') continue; $new_filters[$_filter]=$this->filters[$_filter]; } $this->filters=$new_filters; return $this->SoapEngine->execute($function,$this->html); } function showAddForm() { if ($this->filters['username']) return; if (!count($this->allowedDomains)) { print "

You must create at least one SIP domain before adding SIP accounts
"; return false; } printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; if ($_REQUEST['account']) { $_account=$_REQUEST['account']; } else { $_account=$this->getCustomerProperty('sip_accounts_last_username'); } printf ("
Account
",$_account); if ($_REQUEST['domain']) { $_domain=$_REQUEST['domain']; $selected_domain[$_REQUEST['domain']]='selected'; } else if ($this->filters['domain']) { $_domain=$this->filters['domain']; $selected_domain[$this->filters['domain']]='selected'; } else if ($_domain=$this->getCustomerProperty('sip_accounts_last_domain')) { $selected_domain[$_domain]='selected'; } if (count($this->allowedDomains) > 0) { print "@"; } else { printf (" ",$_domain); } if ($_REQUEST['quota']) { $_quota=$_REQUEST['quota']; } else { $_quota=$this->getCustomerProperty('sip_accounts_last_quota'); } if (!$_quota) $_quota=''; if ($_prepaid=$this->getCustomerProperty('sip_accounts_last_prepaid')) { $checked_prepaid='checked'; } else { $checked_prepaid=''; } if ($_pstn=$this->getCustomerProperty('sip_accounts_last_pstn')) { $checked_pstn='checked'; } else { $checked_pstn=''; } printf ("
Password
",$_REQUEST['password']); printf ("
Name
",$_REQUEST['fullname']); printf ("
Email
",$_REQUEST['email']); printf ("
Owner
",$_REQUEST['owner']); if ($this->getResellerProperty('pstn_access')) { printf (" PSTN ",$checked_pstn); printf ("
Quota
",$_quota); if ($this->prepaidChangesAllowed()) { printf (" Prepaid ",$checked_prepaid); } else { printf (" Prepaid "); } } $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { dprint_r($dictionary); if ($dictionary['account']) { $account_els = explode("@", $dictionary['account']); $this->skipSaveProperties=true; } else { $account_els = explode("@", trim($_REQUEST['account'])); } list($customer,$reseller)=$this->customerFromLogin($dictionary); $username=$account_els[0]; if (strlen($account_els[1])) { $domain=$account_els[1]; } else if ($dictionary['domain']) { $domain=$dictionary['domain']; } else if ($_REQUEST['domain']) { $domain=trim($_REQUEST['domain']); } else { printf ("

Error: Missing SIP domain"); return false; } if (!$this->validDomain($domain)) { print "Error: invalid domain name"; return false; } if ($dictionary['fullname']) { $name_els = explode(" ", $dictionary['fullname']); } else { $name_els = explode(" ", trim($_REQUEST['fullname'])); } if (strlen($name_els[0])) { $firstName=$name_els[0]; } else { $firstName='Account'; } if (strlen($name_els[1])) { $j=1; while ($j < count($name_els)) { $lastName .= $name_els[$j].' '; $j++; } } else { if ($username=="") { $lastName="Unknown"; } else { $lastName=$username; } } $lastName=trim($lastName); if (strlen($dictionary['timezone'])) { $timezone=$dictionary['timezone']; } else if (strlen(trim($_REQUEST['timezone']))) { $timezone=trim($_REQUEST['timezone']); } else if ($this->SoapEngine->default_timezone) { $timezone=$this->SoapEngine->default_timezone; } else { $timezone='Europe/Amsterdam'; } if (!in_array($timezone,$this->timezones)) { $timezone='Europe/Amsterdam'; } if (strlen($dictionary['password'])) { $password=$dictionary['password']; } else if (strlen(trim($_REQUEST['password']))) { $password=trim($_REQUEST['password']); } else { $password=$this->RandomString(10); } if (is_array($dictionary['groups'])) { $groups=$dictionary['groups']; } else { $groups=array(); } if (is_array($dictionary['ip_access_list'])) { $ip_access_list=$dictionary['ip_access_list']; } else { $ip_access_list=array(); } if (strlen($dictionary['call_limit'])) { $call_limit=$dictionary['call_limit']; } else { $call_limit=$_REQUEST['call_limit']; } if($dictionary['pstn'] || $_REQUEST['pstn']) { $_pstn=1; $groups[]='free-pstn'; } else { $_pstn=0; } if (strlen($dictionary['email'])) { $email=$dictionary['email']; } else { $email=trim($_REQUEST['email']); } if (strlen($dictionary['rpid'])) { $rpid=$dictionary['rpid']; } else { $rpid=trim($_REQUEST['rpid']); } if (strlen($dictionary['owner'])) { $owner=intval($dictionary['owner']); } else { $owner=intval($_REQUEST['owner']); } if (!$owner) { $owner = intval($customer); } if (strlen($dictionary['quota'])) { $quota=intval($dictionary['quota']); } else { $quota=intval($_REQUEST['quota']); } if ($this->prepaidChangesAllowed()) { if (strlen($dictionary['prepaid'])) { $prepaid=intval($dictionary['prepaid']); } else { $prepaid=intval($_REQUEST['prepaid']); } } else { $prepaid = 1; } if ($prepaid) { $groups[]='prepaid'; } if (!$email) { if ($username=="") { $email='unknown@'.strtolower($domain); } else { $email=strtolower($username).'@'.strtolower($domain); } } if (!$this->skipSaveProperties) { $_p=array( array('name' => 'sip_accounts_last_domain', 'category' => 'web', 'value' => "$domain", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_username', 'category' => 'web', 'value' => "$username", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_timezone', 'category' => 'web', 'value' => "$timezone", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_quota', 'category' => 'web', 'value' => "$quota", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_pstn', 'category' => 'web', 'value' => "$_pstn", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_prepaid', 'category' => 'web', 'value' => "$prepaid", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } if (is_array($dictionary['properties'])) { $properties=$dictionary['properties']; } else { $properties=array(); } if ($this->SoapEngine->login_credentials['reseller']) { $reseller_properties=$this->getResellerProperties($this->SoapEngine->login_credentials['reseller'],'store_clear_text_passwords'); if (strlen($reseller_properties['store_clear_text_passwords'])) { $this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords']; } } else { $_reseller=$this->getResellerForDomain(strtolower($domain)); if ($_reseller) { $reseller_properties=$this->getResellerProperties($_reseller,'store_clear_text_passwords'); if (strlen($reseller_properties['store_clear_text_passwords'])) { $this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords']; } } } if ($this->store_clear_text_passwords || $username == '') { $password_final=$password; } else { $md1=strtolower($username).':'.strtolower($domain).':'.$password; $md2=strtolower($username).'@'.strtolower($domain).':'.strtolower($domain).':'.$password; $password_final=md5($md1).':'.md5($md2); } $account=array( 'id' => array('username' => strtolower($username), 'domain' => strtolower($domain) ), 'firstName' => $firstName, 'lastName' => $lastName, 'password' => $password_final, 'timezone' => $timezone, 'email' => strtolower($email), 'owner' => $owner, 'rpid' => $rpid, 'groups' => $groups, 'prepaid' => $prepaid, 'quota' => $quota, 'acl' => $ip_access_list, 'properties' => $properties ); if (isset($call_limit)) { $account['callLimit'] = intval($call_limit); } //print_r($account); $deleteAccount=array('username' => $username, 'domain' => $domain); if ($this->html) { if ($username == '') { $success_log=sprintf('SIP account has been generated in domain %s',$domain); } else { $success_log=sprintf('SIP account %s@%s has been added',$username,$domain); } } $function=array('commit' => array('name' => 'addAccount', 'parameters' => array($account), 'logs' => array('success' => $success_log)) ); return $this->SoapEngine->execute($function,$this->html); } function getAllowedDomains() { // Filter $filter=array( 'domain' => '' ); // Range $range=array('start' => 0, 'count' => 500 ); $orderBy = array('attribute' => 'domain', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error in getAllowedDomains from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); //return false; } else { foreach ($result->domains as $_domain) { if ($this->validDomain($_domain->domain)) { $this->allowedDomains[]=$_domain->domain; } } } } function showPasswordReminderForm($accounts=array()) { printf ("

"); print _("Login account reminder"); print "

"; print _("

Fill in the e-mail address used during the registration of the SIP account:

"); printf (" "; if (count($accounts) > 1 || $_REQUEST['sip_filter']) { printf ("

"); print _("Warning"); print " "; print _("More than one account uses this email address. If you wish to receive the password for a particular account fill in the SIP account below, default it has been send it to the first 5 accounts found"); print "
"; printf (" ", $_REQUEST['sip_filter']); } printf ("
"); } function showPasswordReminderUpdateFormEncrypted($id, $account) { if ($account) { printf ("

"); print _("Update passwords"); print ""; print " (for "; print $account; print ")

"; print _("

Please choose new passwords for your account, if you leave them empty no change will be performed

"); print "
"; print "
"; print "
"; print ""; print "
"; print ""; print ""; print "
"; print "
"; print ""; print "
"; print ""; print ""; print "
"; print "
"; printf ("
"); } } function showPasswordReminderFormEncrypted($accounts=array()) { printf ("

"); print _("Sip Account Reminder/Password Reset"); print "

"; //print _("

Please fill in the SIP account and e-mail address used during the registration of the SIP account to receive a login reminder and a possiblity to reset your passwords.

"); if (count($accounts) < 1 && $_REQUEST['sip_filter'] && $_REQUEST['email_filter']) { printf ("
"); print _("Error"); print "
"; print _("The email adress does not match email address in the SIP account, or the SIP account does not exist."); print "
"; print _("An email has not been sent."); print "
"; } else if(count($accounts) < 1 && $_REQUEST['email_filter']) { printf ("
"); print _("Error"); print ": "; print _("The email adress does not match the email address in any SIP account."); print "
"; print _("An email has not been sent."); print "
"; } print " "; print ""; print ""; printf ("
"); if(count($accounts) < 1 && $_REQUEST['sip_filter']) { print ""; } } function getAccountsForPasswordReminderEncrypted($maximum_accounts=5) { $accounts=array(); //$filter = array('email' => $this->filters['email']); if ($_REQUEST['sip_filter']) { list($username,$domain)=explode('@',trim($_REQUEST['sip_filter'])); if ($username && $domain) { $filter = array('username' => $username, 'domain' => $domain, 'email' => $this->filters['email'] ); } } else { $filter = array('email' => $this->filters['email']); } $range = array('start' => 0, 'count' => $maximum_accounts); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC'); $Query = array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); } else { $i=0; while ($i < $result->total) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $accounts[]=array('username'=> $account->id->username, 'domain' => $account->id->domain ); $i++; } } return $accounts; } function getAccountsForPasswordReminder($maximum_accounts=5) { $accounts=array(); $filter = array('email' => $this->filters['email']); if ($_REQUEST['sip_filter']) { list($username,$domain)=explode('@',trim($_REQUEST['sip_filter'])); if ($username && $domain) { $filter = array( 'username' => $username, 'domain' => $domain ); } } $range = array('start' => 0, 'count' => $maximum_accounts); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC'); $Query = array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); } else { $i=0; while ($i < $result->total) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $accounts[]=array('username'=> $account->id->username, 'domain' => $account->id->domain ); $i++; } } return $accounts; } function getResellerForDomain($domain='') { // Filter $filter=array( 'domain' => $domain ); // Range $range=array('start' => 0, 'count' => 1 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); // Call function $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->domains[0]){ return $result->domains[0]->reseller; } else { return false; } } } function getResellerProperties($reseller='',$property='') { $properties=array(); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$reseller) { dprint ("No customer provided"); return true; } if (!$property) { dprint ("No property provided"); return true; } $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $result = $this->SoapEngine->soapclientCustomers->getProperties(intval($reseller)); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } foreach ($result as $_property) { $properties[$_property->name]=$_property->value; } return $properties; } function pstnChangesAllowed() { //dprint_r($this->loginProperties); $_customer_pstn_changes=$this->getCustomerProperty('pstn_changes'); $_reseller_pstn_changes=$this->getCustomerProperty('pstn_changes'); if ($this->adminonly) { return true; } else if ($this->customer == $this->reseller && $_reseller_pstn_changes) { return true; } else if ($this->loginImpersonate == $this->reseller && $_reseller_pstn_changes) { return true; } else if ($_reseller_pstn_changes && $_customer_pstn_changes) { return true; } return false; } function prepaidChangesAllowed() { //dprint_r($this->loginProperties); $_customer_prepaid_changes=$this->getCustomerProperty('prepaid_changes'); $_reseller_prepaid_changes=$this->getCustomerProperty('prepaid_changes'); if ($this->adminonly) { return true; } else if ($this->customer == $this->reseller && $_reseller_prepaid_changes) { return true; } else if ($this->loginImpersonate == $this->reseller && $_reseller_prepaid_changes) { return true; } else if ($_reseller_prepaid_changes && $_customer_prepaid_changes) { return true; } return false; } function getTimezones () { $this->timezones=array(); if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } while ($buffer = fgets($fp,1024)) { $this->timezones[]=trim($buffer); } fclose($fp); } function showTextBeforeCustomerSelection() { print _("Domain owner"); } } class SipAliases extends Records { var $selectionActiveExceptions=array('alias_domain'); function SipAliases($SoapEngine) { dprint("init SipAliases"); $target_filters_els=explode("@",trim($_REQUEST['target_username_filter'])); $target_username=$target_filters_els[0]; if (count($target_filters_els) > 1) { $target_domain=$target_filters_els[1]; } $this->filters = array('alias_username' => strtolower(trim($_REQUEST['alias_username_filter'])), 'alias_domain' => strtolower(trim($_REQUEST['alias_domain_filter'])), 'target_username' => strtolower($target_username), 'target_domain' => strtolower($target_domain) ); $this->Records($SoapEngine); $this->sortElements=array( 'changeDate' => 'Change date', 'aliasUsername' => 'Alias user', 'aliasDomain' => 'Alias domain', 'targetUsername' => 'Target user', 'targetDomain' => 'Target domain', ); } function getRecordKeys() { // Filter $filter=array('aliasUsername' => $this->filters['alias_username'], 'aliasDomain' => $this->filters['alias_domain'], 'targetUsername' => $this->filters['target_username'], 'targetDomain' => $this->filters['target_domain'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 500 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'aliasUsername'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); //dprint_r($Query); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAliases'); // Call function $result = $this->SoapEngine->soapclient->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->aliases as $alias) { $this->selectionKeys[]=array('username' => $alias->id->username, 'domain' => $alias->id->domain); } return true; } } function listRecords() { $this->getAllowedDomains(); // Make sure we apply the domain filter from the login credetials $this->showSeachForm(); // Filter $filter=array('aliasUsername' => $this->filters['alias_username'], 'aliasDomain' => $this->filters['alias_domain'], 'targetUsername' => $this->filters['target_username'], 'targetDomain' => $this->filters['target_domain'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAliases'); // Call function $result = $this->SoapEngine->soapclient->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->aliases[$i]) break; $alias = $result->aliases[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&alias_username_filter=%s&alias_domain_filter=%s", urlencode($this->SoapEngine->service), urlencode($alias->id->username), urlencode($alias->id->domain) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['alias_username_filter'] == $alias->id->username && $_REQUEST['alias_domain_filter'] == $alias->id->domain) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } /* $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($alias->customer) ); */ $_sip_accounts_url = $this->url.sprintf("&service=sip_accounts@%s&username_filter=%s&domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($alias->target->username), urlencode($alias->target->domain) ); if ($alias->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($alias->owner), $alias->owner ); } else { $_owner_url=''; } printf(" ", $index, $alias->id->username, $alias->id->domain, $_sip_accounts_url, $alias->target->username, $alias->target->domain, $_owner_url, $alias->changeDate, $_url, $actionText ); $i++; } } print "
Id SIP alias Redirect target Owner Change date Actions
%s %s@%s %s@%s %s %s %s
"; $this->showPagination($maxrows); /* $_properties=array( array('name' => $this->SoapEngine->port.'_sortBy', 'value' => $this->sorting['sortBy'], 'permission' => 'customer', 'category' => 'web' ), array('name' => $this->SoapEngine->port.'_sortOrder', 'value' => $this->sorting['sortOrder'], 'permission' => 'customer', 'category' => 'web' ) ); print_r($_properties); $this->setCustomerProperties($_properties); */ return true; } } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['alias_username']) { $alias_username=$dictionary['alias_username']; } else { $alias_username=$this->filters['alias_username']; } if ($dictionary['alias_domain']) { $alias_domain=$dictionary['alias_domain']; } else { $alias_domain=$this->filters['alias_domain']; } if (!strlen($alias_username) || !strlen($alias_domain)) { print "

Error: missing SIP alias username or domain. "; return false; } $alias=array('username' => $alias_username, 'domain' => $alias_domain ); $function=array('commit' => array('name' => 'deleteAlias', 'parameters' => array($alias), 'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$this->filters['alias_username'],$this->filters['alias_domain']) ) ) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

SIP alias
",$this->filters['alias_username']); printf ("@"); if (count($this->allowedDomains) > 0) { if ($this->filters['alias_domain'] && !in_array($this->filters['alias_domain'],$this->allowedDomains)) { printf ("",$this->filters['alias_domain']); } else { $selected_domain[$this->filters['alias_domain']]='selected'; printf (""); } } else { printf ("",$this->filters['alias_domain']); } printf ("
Redirect target
",trim($_REQUEST['target_username_filter'])); printf ("
Owner
",$this->filters['owner']); } function showAddForm() { if ($this->selectionActive) return; if (!count($this->allowedDomains)) { print "

You must create at least one SIP domain before adding SIP aliases"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; printf ("
SIP alias
"); if ($_REQUEST['domain']) { $_domain=$_REQUEST['domain']; $selected_domain[$_REQUEST['domain']]='selected'; } else if ($_domain=$this->getCustomerProperty('sip_aliases_last_domain')) { $selected_domain[$_domain]='selected'; } if (count($this->allowedDomains) > 0) { print "@"; } else { printf (" ",$_domain); } printf ("
Redirect target
"); printf ("
Owner
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['alias']) { $alias_els = explode("@", $dictionary['alias']); $this->skipSaveProperties=true; } else { $alias_els = explode("@", trim($_REQUEST['alias'])); } if ($dictionary['target']) { $target_els = explode("@", $dictionary['target']); } else { $target_els = explode("@", trim($_REQUEST['target'])); } if ($dictionary['owner']) { $owner = $dictionary['owner']; } else { $owner = $_REQUEST['owner']; } if (preg_match("/:(.*)$/",$target_els[0],$m)) { $target_username=$m[1]; } else { $target_username=$target_els[0]; } if (preg_match("/:(.*)$/",$alias_els[0],$m)) { $username=$m[1]; } else { $username=$alias_els[0]; } if (strlen($alias_els[1])) { $domain=$alias_els[1]; } else if (trim($_REQUEST['domain'])) { $domain=trim($_REQUEST['domain']); } else { if ($this->html) { printf ("

Error: Missing SIP domain"); } return false; } if (!$this->validDomain($domain)) { if ($this->html) { print "Error: invalid domain name"; } return false; } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!$this->skipSaveProperties=true) { $_p=array( array('name' => 'sip_aliases_last_domain', 'category' => 'web', 'value' => strtolower($domain), 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } $alias=array( 'id' => array('username' => strtolower($username), 'domain' => strtolower($domain) ), 'target' => array('username' => strtolower($target_username), 'domain' => strtolower($target_els[1]) ), 'owner' => intval($owner) ); $deleteAlias=array('username' => strtolower($username), 'domain' => strtolower($domain) ); $function=array('commit' => array('name' => 'addAlias', 'parameters' => array($alias), 'logs' => array('success' => sprintf('SIP alias %s@%s has been added',$username,$domain))) ); return $this->SoapEngine->execute($function,$this->html); } function getAllowedDomains() { // Filter $filter=array( 'domain' => '' ); // Range $range=array('start' => 0, 'count' => 500 ); $orderBy = array('attribute' => 'domain', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->domains as $_domain) { if ($this->validDomain($_domain->domain)) { $this->allowedDomains[]=$_domain->domain; } } } } function showTextBeforeCustomerSelection() { print _("Domain owner"); } } class EnumRanges extends Records { var $selectionActiveExceptions=array('tld'); var $record_generator=''; // only admin can add prefixes below var $deniedPrefixes=array('1','20','210','211','212','213','214','215','216','217','218','219','220','221','222','223','224','225','226','227','228','229','230','231','232','233','234','235','236','237','238','239','240','241','242','243','244','245','246','247','248','249','250','251','252','253','254','255','256','257','258','259','260','261','262','263','264','265','266','267','268','269','27','280','281','282','283','284','285','286','287','288','289','290','291','292','293','294','295','296','297','298','299','30','31','32','33','34','350','351','352','353','354','355','356','357','358','359','36','370','371','372','373','374','375','376','377','378','379','380','381','382','383','384','385','386','387','388','389','39','40','41','420','421','422','423','424','425','426','427','428','429','43','44','45','46','47','48','49','500','501','502','503','504','505','506','507','508','509','51','52','53','54','55','56','57','58','590','591','592','593','594','595','596','597','598','599','60','61','62','63','64','65','66','670','671','672','673','674','675','676','677','678','679','680','681','682','683','684','685','686','687','688','689','690','691','692','693','694','695','696','697','698','699','7','800','801','802','803','804','805','806','807','808','809','81','82','830','831','832','833','834','835','836','837','838','839','84','850','851','852','853','854','855','856','857','858','859','86','870','871','872','873','874','875','876','877','878','879','880','881','882','883','884','885','886','887','888','889','890','891','892','893','894','895','896','897','898','899','90','91','92','93','94','95','960','961','962','963','964','965','966','967','968','969','970','971','972','973','974','975','976','977','978','979','98','990','991','992','993','994','995','996','997','998','999'); var $FieldsAdminOnly=array( 'reseller' => array('type'=>'integer', 'help' => 'Range owner') ); var $Fields=array( 'customer' => array('type'=>'integer', 'help' => 'Range owner' ), 'serial' => array('type'=>'integer', 'help'=>'DNS serial number', 'readonly' => 1 ), 'ttl' => array('type'=>'integer', 'help'=>'Cache period in DNS clients' ), 'info' => array('type'=>'string', 'help' =>'Range description' ), 'size' => array('type'=>'integer', 'help'=>'Maximum number of telephone numbers' ), 'minDigits' => array('type'=>'integer', 'help'=>'Minimum number of digits for telephone numbers' ), 'maxDigits' => array('type'=>'integer', 'help'=>'Maximum number of digits for telephone numbers' ) ); function EnumRanges($SoapEngine) { dprint("init EnumRanges"); $this->filters = array('prefix' => trim(ltrim($_REQUEST['prefix_filter']),'+'), 'tld' => trim($_REQUEST['tld_filter']), 'info' => trim($_REQUEST['info_filter']) ); $this->Records($SoapEngine); $this->sortElements=array('changeDate' => 'Change date', 'prefix' => 'Prefix', 'tld' => 'TLD' ); /* $this->Fields['nameservers'] = array('type'=>'text', 'name'=>'Name servers', 'help'=>'Name servers authoritative for this DNS zone' ); */ if ($this->login_credentials['reseller_filters'][$this->reseller]['record_generator']) { //printf ("Engine: %s",$this->SoapEngine->soapEngine); if (is_array($this->login_credentials['reseller_filters'][$this->reseller]['record_generator'])) { $_rg=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator']; if ($_rg[$this->SoapEngine->soapEngine]) { $this->record_generator=$_rg[$this->SoapEngine->soapEngine]; } } else { $this->record_generator=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator']; } } else if (strlen($this->SoapEngine->record_generator)) { $this->record_generator=$this->SoapEngine->record_generator; } } function listRecords() { $this->getAllowedDomains(); $this->showSeachForm(); // Filter $filter=array('prefix' => $this->filters['prefix'], 'tld' => $this->filters['tld'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->ranges[$i]) break; $range = $result->ranges[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&prefix_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($range->id->prefix), urlencode($range->id->tld) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$range->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['prefix_filter'] == $range->id->prefix && $_REQUEST['tld_filter'] == $range->id->tld) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($this->adminonly) { $range_url=sprintf('%s',$this->url,$this->SoapEngine->service,$range->reseller,$range->id->prefix,$range->id->tld,$range->id->prefix); } else { $range_url=sprintf('%s',$this->url,$this->SoapEngine->service,$range->id->prefix,$range->id->tld,$range->id->prefix); } if ($this->record_generator) { $generator_url=sprintf('+Numbers',$this->url,$this->record_generator,$range->id->prefix,$range->id->tld,$range->maxDigits,$range->reseller); } else { $generator_url=''; } if ($range->size) { $usage=intval(100*$range->used/$range->size); $bar=$this->makebar($usage); } else { $bar=""; } $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($range->customer) ); $_nameservers=''; foreach ($range->nameservers as $_ns) { $_nameservers.= $_ns.' '; } printf(" ", $index, $_customer_url, $range->customer, $range->reseller, $range_url, $range->id->tld, $range->serial, $range->ttl, $range->info, $range->minDigits, $range->maxDigits, $range->size, $range->used, $bar, $range->changeDate, $_url, $actionText, $generator_url ); $i++; } } print "
Id Owner Prefix TLD Serial TTL Info Min Max Size Used Change date Actions
%s %s.%s +%s %s %s %s %s %s %s %s %s %s %s %s%s
"; if ($this->rows == 1) { $this->showRecord($range); } else { $this->showPagination($maxrows); } return true; } } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['prefix']) || !strlen($this->filters['tld'])) { print "

Error: missing ENUM range id "; return false; } $rangeId=array('prefix'=>$this->filters['prefix'], 'tld'=>$this->filters['tld']); $function=array('commit' => array('name' => 'deleteRange', 'parameters' => array($rangeId), 'logs' => array('success' => sprintf('ENUM range +%s under %s has been deleted',$this->filters['prefix'],$this->filters['tld']) ) ) ); unset($this->filters); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showAddForm() { if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
Prefix +
",$_REQUEST['prefix']); printf ("
TLD"); if ($_REQUEST['tld']) { printf ("
",$_REQUEST['tld']); } else if ($this->filters['tld']) { printf ("
",$this->filters['tld']); } else if ($_tld=$this->getCustomerProperty('enum_ranges_last_tld')) { printf ("
",$_tld); } else { printf ("
"); } printf ("
TTL
"); printf ("
Min Digits
"); printf ("
Max Digits
"); printf ("
Info
",$_REQUEST['info']); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { $tld = trim($_REQUEST['tld']); $prefix = trim($_REQUEST['prefix']); $size = trim($_REQUEST['size']); $info = trim($_REQUEST['info']); if (!strlen($tld)) { $tld=$this->SoapEngine->default_enum_tld; } if (!strlen($tld) || !strlen($prefix) || !is_numeric($prefix)) { printf ("

Error: Missing TLD or prefix. "); return false; } if (!$this->adminonly) { if (in_array($prefix,$this->deniedPrefixes)) { print "

Error: Only an administrator account can create the prefix coresponding to a country code."; return false; } } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!trim($_REQUEST['ttl'])) { $ttl = 3600; } else { $ttl = intval(trim($_REQUEST['ttl'])); } $range = array( 'id' => array( 'prefix' => $prefix, 'tld' => $tld ), 'ttl' => $ttl, 'info' => $info, 'minDigits' => intval(trim($_REQUEST['minDigits'])), 'maxDigits' => intval(trim($_REQUEST['maxDigits'])), 'size' => intval($size), 'customer' => intval($customer), 'reseller' => intval($reseller) ); $deleteRange = array( 'prefix'=>$prefix, 'tld'=>$tld ); $_p = array( array( 'name' => 'enum_ranges_last_tld', 'category' => 'web', 'value' => "$tld", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); $function = array( 'commit' => array( 'name' => 'addRange', 'parameters' => array($range), 'logs' => array('success' => sprintf('ENUM range +%s under %s has been added',$prefix,$tld)) ) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showSeachFormCustom() { printf ("

Prefix
",$this->filters['prefix']); printf ("
TLD"); if (count($this->allowedDomains) > 0) { $selected_tld[$this->filters['tld']]='selected'; printf ("
"); } else { printf ("
",$this->filters['tld']); } printf ("
Info
",$this->filters['info']); } function getAllowedDomains() { // Filter $filter=array('prefix' => ''); // Range $range=array('start' => 0, 'count' => 500 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach($result->ranges as $range) { $this->ranges[]=array('prefix' => $range->id->prefix, 'tld' => $range->id->tld, 'minDigits' => $range->minDigits, 'maxDigits' => $range->maxDigits ); if (in_array($range->id->tld,$this->allowedDomains)) continue; $this->allowedDomains[]=$range->id->tld; $seen[$range->id->tld]++; } if (!$seen[$this->SoapEngine->default_enum_tld]) { $this->allowedDomains[]=$this->SoapEngine->default_enum_tld; } } } function showRecord($range) { print ""; print " ",$this->filters['reseller']); printf ("",$this->filters['reseller']); } else if ($this->reseller) { printf ("",$this->reseller); } foreach (array_keys($this->addFields) as $item) { if ($this->addFields[$item]['name']) { $item_name=$this->addFields[$item]['name']; } else { $item_name=ucfirst($item); } $item_form=$item.'_form'; if ($item=='timezone') { $_value=$_REQUEST['timezone_form']; if (!$_value) { if ($this->SoapEngine->default_timezone) { $_value=$this->SoapEngine->default_timezone; } else { $_value='Europe/Amsterdam'; } } printf ("
"; $this->showTimezones($_value); print "
"; } else if ($item=='state') { printf ("
", $item_name ); print "
"; } else if ($item=='country') { printf ("
", $item_name ); print "
"; } else { if ($this->addFields[$item]['type'] == 'textarea') { printf ("
", $item_name, $item, $_REQUEST[$item_form] ); } elseif ($this->addFields[$item]['type'] == 'boolean') { $_var='select_'.$item; ${$_var}[$_REQUEST[$item_form]]='selected'; printf (" ", $item_name, $item, ${$_var}[0], ${$_var}[1] ); } else { $type='text'; if (strstr($item,'password')) $type='password'; printf ("
", $item_name, $item, $type, $_REQUEST[$item_form] ); if ($item=='password' && $confirmPassword) { printf ("
", $_REQUEST[confirm_password_form] ); } } } } if ($_REQUEST['notify']) $checked_notify='checked'; printf ("
",$checked_notify); $this->printHiddenFormElements(); print ""; print " "; } function addRecord($dictionary=array(),$confirmPassword=false) { if (!$this->checkRecord($dictionary)) { return false; } foreach (array_keys($this->addFields) as $item) { if ($dictionary[$item]) { $customer[$item] = strip_tags(trim($dictionary[$item])); } else { $item_form = $item.'_form'; $customer[$item] = strip_tags(trim($_REQUEST[$item_form])); } } if (!strlen($customer['username'])) $customer['username'] = trim($customer['firstName']).'.'.trim($customer['lastName'].$this->RandomNumber(5)); if (!strlen($customer['state'])) $customer['state'] = 'N/A'; if (!strlen($customer['country'])) $customer['country'] = 'N/A'; if (!strlen($customer['city'])) $customer['city'] = 'Unknown'; if (!strlen($customer['address'])) $customer['address'] = 'Unknown'; if (!strlen($customer['postcode'])) $customer['postcode'] = 'Unknown'; if (!strlen($customer['timezone'])) $customer['timezone'] = 'Europe/Amsterdam'; if ($dictionary['reseller']) { $customer['reseller']=intval($dictionary['reseller']); } else if ($this->adminonly && $this->filters['reseller']) { $customer['reseller']=intval($this->filters['reseller']); } $customer['username'] = strtolower(preg_replace ("/\s+/",".",trim($customer['username']))); $customer['username'] = preg_replace ("/\.{2,}/",".",$customer['username']); if ($customer['state'] != 'N/A') { $_state=$customer['state'].' '; } else { $_state=''; } if (!strlen($customer['tel'])){ $customer['tel'] = '+19999999999'; } else { $customer['tel'] = preg_replace("/[^0-9\+]/","",$customer['tel']); if (preg_match("/^00(\d{1,20})$/",$customer['tel'],$m)) { $customer['tel'] = "+".$m[1]; } } $customer['billingEmail'] = $customer['email']; if ($customer['address'] != 'Unknown') { $customer['billingAddress'] = $customer['address']."\n". $customer['postcode']." ".$customer['city']."\n". $_state.$customer['country']."\n"; } if ($confirmPassword) { if (!strlen($customer['password'])) { $this->errorMessage='Password cannot be empty'; return false; } else if ($customer['password'] != $_REQUEST['confirm_password_form']) { $this->errorMessage='Password is not confirmed'; return false; } } if (!strlen($customer['password'])) $customer['password'] = $this->RandomString(6); if (is_array($dictionary['properties'])) { $customer['properties']=$dictionary['properties']; } else { $customer['properties']=array(); } if ($this->hide_html) { $logs = array(); } else { $logs = array('success' => sprintf('Customer entry %s %s has been created',$customer['firstName'],$customer['lastName'])); } $function=array('commit' => array('name' => 'addAccount', 'parameters' => array($customer), 'logs' => $logs ) ); if ($result = $this->SoapEngine->execute($function,$this->html)) { // We have succesfully added customer entry $this->showAddForm=false; if ($dictionary['notify'] || $_REQUEST['notify']) $this->notify($customer); return $result; } else { return false; } } function notify($customer) { /* must be supplied with an array: $customer=array('firstName' => '' 'lastName' => '', 'email' => '', 'username' => '', 'password' => '' ); */ if ($this->support_web) { $url=$this->support_web; } else { if ($_SERVER['HTTPS']=="on") { $protocolURL="https://"; } else { $protocolURL="http://"; } $url=sprintf("%s%s",$protocolURL,$_SERVER['HTTP_HOST']); } $body= sprintf("Dear %s,\n\n",$customer['firstName']). sprintf("This e-mail message is for your record. You have registered a login account at %s as follows:\n\n",$url). sprintf("Username: %s\n",$customer['username']). sprintf("Password: %s\n",$customer['password']). "\n". sprintf("The registration has been performed from the IP address %s.",$_SERVER['REMOTE_ADDR']). "\n". "\n". sprintf("This message was sent in clear text over the Internet and it is advisable, in order to protect your account, to login and change your password displayed in this message. "). "\n". "\n". "This is an automatic message, do not reply.\n"; $from = sprintf("From: %s",$this->support_email); $subject = sprintf("Your account at %s",$url); return mail($customer['email'], $subject, $body, $from); } function getRecordKeys() { // Filter $filter=array('username' => $this->filters['username'], 'firstName' => $this->filters['firstName'], 'lastName' => $this->filters['lastName'], 'organization' => $this->filters['organization'], 'tel' => $this->filters['tel'], 'email' => $this->filters['email'], 'web' => $this->filters['web'], 'city' => $this->filters['city'], 'country' => $this->filters['country'], 'only_resellers' => $this->filters['only_resellers'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 1000 ); // Order $orderBy = array('attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function if ($this->adminonly && $this->filters['only_resellers']) { $this->log_action('getResellers'); $result = $this->SoapEngine->soapclient->getResellers($Query); } else { $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); } if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->accounts as $customer) { $this->selectionKeys[]=$customer->id; } } } function getProperty($customer,$name) { foreach ($customer->properties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function getCustomerId($username) { if (!strlen($username)) return false; $filter = array('username' => $username); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); $Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if (count($result->accounts) == 1) { return $result->accounts[0]->id; } else { return false; } } } function getCustomer($username) { if (!strlen($username)) { return false; } $filter = array('username' => $username); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); $Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if (count($result->accounts) == 1) { return $result->accounts[0]; } else { return false; } } } function setInitialCredits($credits=array()) { $properties=array(); foreach (array_keys($credits) as $item) { if ($this->allProperties[$item]['category'] != 'credit') continue; $properties[] = array('name' => $item, 'value' => "$credits[$item]", 'category' => $this->allProperties[$item]['category'], 'permission' => $this->allProperties[$item]['permission'] ); } return $properties; } function showVcard($vcardDictionary) { #http://www.stab.nu/vcard/ # This file will return an vCard Version 3.0 Compliant file to the user. Observe that you should set up # # your web-server with the correct MIME-type. The reason to use the \r\n as breakes is because it should be # # more compatible with MS Outlook. All other, better coded, clients sholdnt have any problems with this. # # # # Version 1.0 (2003-08-29) # # # # Author: Alf Lovbo # # # # This document is released under the GNU General Public License. # # # ############################################################################################################# # # # USAGE # # ----- # # The following variables can be used togheter with this document for accessing the functions supplied. All # # of the functions listed below takes an value described by the comment after the |-symbol. # # # # $vcard_birtda | Birthday YYYY-MM-DD $vcard_f_name | Family name # # $vcard_cellul | Cellular Phone Number $vcard_compan | Company Name # # $vcard_h_addr | Street Address (home) $vcard_h_city | City (home) # # $vcard_h_coun | Country (home) $vcard_h_fax | Fax (home) # # $vcard_h_mail | E-mail (home) $vcard_h_phon | Phone (home) # # $vcard_h_zip | Zip-code (home) $vcard_nickna | Nickname # # $vcard_note | Note $vcard_s_name | Given name # # $vcard_uri | Homepage, URL $vcard_w_addr | Street Address (work) # # $vcard_w_city | City (work) $vcard_w_coun | Country (work) # # $vcard_w_fax | Fax (work) $vcard_w_mail | E-mail (work) # # $vcard_w_phon | Phone (work) $vcard_w_role | Function (work) # # $vcard_w_titl | Title (work) $vcard_w_zip | Zip-code (work) # # # ############################################################################################################# # You dont need to change anything below this comment. # ############################################################################################################# /* $vcardDictionary=array( "vcard_nickna" => $this->username, "vcard_f_name" => $this->lastname, "vcard_s_name" => $this->firstname, "vcard_compan" => $this->organization, "vcard_w_addr" => $this->address, "vcard_w_zip" => $this->postcode, "vcard_w_city" => $this->city, "vcard_w_state" => $this->county, "vcard_w_coun" => $this->country, "vcard_w_mail" => $this->email, "vcard_w_phon" => $this->tel, "vcard_w_fax" => $this->fax, "vcard_enum" => $this->enum, "vcard_sip" => $this->sip, "vcard_uri" => $this->web, "vcard_cellul" => $this->mobile ); */ foreach (array_keys($vcardDictionary) as $field) { $value=$vcardDictionary[$field]; ${$field}=$value; } if ($vcard_w_state=="N/A") $vcard_w_state=" "; $vcard_w_addr = preg_replace("/[\n|\r]/"," ",$vcard_w_addr); $vcard_sortst = $vcard_f_name; $vcard_tz = date("O"); $vcard_rev = date("Y-m-d"); $vcard = "BEGIN:VCARD\r\n"; $vcard .= "VERSION:3.0\r\n"; $vcard .= "CLASS:PUBLIC\r\n"; $vcard .= "PRODID:-//PHP vCard Class//NONSGML Version 1//SE\r\n"; $vcard .= "REV:" . $vcard_rev . "\r\n"; $vcard .= "TZ:" . $vcard_tz . "\r\n"; if ($vcard_f_name != ""){ if ($vcard_s_name != ""){ $vcard .= "FN:" . $vcard_s_name . " " . $vcard_f_name . "\r\n"; $vcard .= "N:" . $vcard_f_name . ";" . $vcard_s_name . "\r\n"; } else { $vcard .= "FN:" . $vcard_f_name . "\r\n"; $vcard .= "N:" . $vcard_f_name . "\r\n"; } } elseif ($vcard_s_name != ""){ $vcard .= "FN:" . $vcard_s_name . "\r\n"; $vcard .= "N:" . $vcard_s_name . "\r\n"; } if ($vcard_nickna != ""){ $vcard .= "NICKNAME:" . $vcard_nickna . "\r\n"; } if ($vcard_compan != ""){ $vcard .= "ORG:" . $vcard_compan . "\r\n"; $vcard .= "SORTSTRING:" . $vcard_compan . "\r\n"; } elseif ($vcard_f_name != ""){ $vcard .= "SORTSTRING:" . $vcard_f_name . "\r\n"; } if ($vcard_birtda != ""){ $vcard .= "BDAY:" . $vcard_birtda . "\r\n"; } if ($vcard_w_role != ""){ $vcard .= "ROLE:" . $vcard_w_role . "\r\n"; } if ($vcard_w_titl != ""){ $vcard .= "TITLE:" . $vcard_w_titl . "\r\n"; } if ($vcard_note != ""){ $vcard .= "NOTE:" . $vcard_note . "\r\n"; } if ($vcard_w_mail != ""){ $item++; $vcard .= "item$item.EMAIL;TYPE=INTERNET;type=PREF:" . $vcard_w_mail . "\r\n"; $vcard .= "item$item.X-ABLabel:email" . "\r\n"; } if ($vcard_cellul != ""){ $vcard .= "TEL;TYPE=VOICE,CELL:" . $vcard_cellul . "\r\n"; } if ($vcard_enum != ""){ $item++; $vcard .= "item$item.TEL:" . $vcard_enum . "\r\n"; $vcard .= "item$item.X-ABLabel:ENUM" . "\r\n"; } if ($vcard_sip != ""){ $item++; $vcard .= "item$item.TEL;TYPE=INTERNET:" . $vcard_sip . "\r\n"; $vcard .= "item$item.X-ABLabel:SIP" . "\r\n"; } if ($vcard_w_fax != ""){ $vcard .= "TEL;TYPE=FAX,WORK:" . $vcard_w_fax . "\r\n"; } if ($vcard_w_phon != ""){ $vcard .= "TEL;TYPE=VOICE,WORK:" . $vcard_w_phon . "\r\n"; } if ($vcard_uri != ""){ $vcard .= "URL:" . $vcard_uri . "\r\n"; } if ($vcard_addr != ""){ $vcard .= "ADR;TYPE=HOME,POSTAL,PARCEL:" . $vcard_addr . "\r\n"; } if ($vcard_labl != ""){ $vcard .= "LABEL;TYPE=DOM,HOME,POSTAL,PARCEL:" . $vcard_labl . "\r\n"; } $vcard_addr = ""; $vcard_labl = ""; if ($vcard_w_addr != ""){ $vcard_addr = ";;" . $vcard_w_addr; $vcard_labl = $vcard_w_addr; } if ($vcard_w_city != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_city; } else{ $vcard_addr .= ";;;" . $vcard_w_city; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_city; } else { $vcard_labl = $vcard_w_city; } } if ($vcard_w_state != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_state; } else{ $vcard_addr .= ";;;" . $vcard_w_state; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_state; } else { $vcard_labl = $vcard_w_state; } } if ($vcard_w_zip != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_zip; } else{ $vcard_addr .= ";;;;" . $vcard_w_zip; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_zip; } else { $vcard_labl = $vcard_w_zip; } } if ($vcard_w_coun != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_coun; } else{ $vcard_addr .= ";;;;;" . $vcard_w_coun; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_coun; } else { $vcard_labl = $vcard_w_coun; } } if ($vcard_addr != ""){ $vcard .= "ADR;TYPE=WORK,POSTAL,PARCEL:" . $vcard_addr . "\r\n"; } if ($vcard_labl != ""){ $vcard .= "LABEL;TYPE=DOM,WORK,POSTAL,PARCEL:" . $vcard_labl . "\r\n"; } if ($vcard_categ != ""){ $vcard .= "CATEGORY:" . $vcard_categ . "\r\n"; } $vcard .= "END:VCARD\n"; return $vcard; } } class Presence { function Presence($SoapEngine) { $this->SoapEngine = $SoapEngine; } function publishPresence ($soapEngine,$SIPaccount=array(),$note='None',$activity='idle') { if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) { print "Error: soapEngine '$soapEngine' does not exist.\n"; return false; } if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) { print "Error: SIP account not defined\n"; return false; } $this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url']; $this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $allowed_activities=array('open', 'idle', 'busy', 'available' ); if (in_array($activity,$allowed_activities)) { $presentity['activity'] = $activity; } else { $presentity['activity'] = 'open'; } $presentity['note'] = $note; $result = $this->PresencePort->setPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password'], $presentity); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function getPresenceInformation ($soapEngine,$SIPaccount) { if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) { print "Error: soapEngine '$soapEngine' does not exist.\n"; return false; } if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) { print "Error: SIP account not defined"; return false; } $this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url']; $this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $result = $this->PresencePort->getPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password']); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return $result; } } } class recordGenerator extends SoapEngine { //this class generates in bulk enum numbers and sip accounts var $template = array(); var $allowedPorts = array(); var $maxRecords = 500; var $minimum_number_length = 4; var $maximum_number_length = 15; var $default_ip_access_list = ''; var $default_call_limit = ''; function recordGenerator($generatorId,$record_generators,$soapEngines,$login_credentials=array()) { $this->record_generators = $record_generators; $this->generatorId = $generatorId; $this->login_credentials = $login_credentials; //dprint_r($this->login_credentials); $keys = array_keys($this->record_generators); if (!$generatorId) $generatorId=$keys[0]; if (!in_array($generatorId,array_keys($this->record_generators))) { return false; } if (strlen($this->login_credentials['soap_filter'])) { $this->soapEngines = $this->getSoapEngineAllowed($soapEngines,$this->login_credentials['soap_filter']); } else { $this->soapEngines = $soapEngines; } if (in_array($this->record_generators[$generatorId]['sip_engine'],array_keys($this->soapEngines))) { // sip zones if (count($this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']]) > 1 && !in_array('sip_accounts',$this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']])) { // sip port not available dprint("sip port not avaliable"); } else { $sip_engine = 'sip_accounts@'.$this->record_generators[$generatorId]['sip_engine']; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $this->sipRecords->getAllowedDomains(); print_r($this->record_generators[$generatorId]['sip_engine']); if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']){ $this->default_ip_access_list = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']; } if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']){ $this->default_call_limit = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']; } } } else { printf ("Error: sip_engine %s does not exist",$this->record_generators[$generatorId]['sip_engine']); } if (in_array($this->record_generators[$generatorId]['enum_engine'],array_keys($this->soapEngines))) { if (count($this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']]) > 1 && !in_array('enum_numbers',$this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']])) { dprint("enum port not avaliable"); // enum port not available } else { // enum mappings $enum_engine = 'enum_numbers@'.$this->record_generators[$generatorId]['enum_engine']; $this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials); $_enum_class = $this->EnumSoapEngine->records_class; $this->enumRecords = new $_enum_class($this->EnumSoapEngine); } } else { printf ("Error: enum_engine %s does not exist",$this->record_generators[$generatorId]['enum_engine']); } if (in_array($this->record_generators[$generatorId]['customer_engine'],array_keys($this->soapEngines))) { if (count($this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']]) > 1 && !in_array('customers',$this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']])) { dprint("customer port not avaliable"); } else { $customer_engine = 'customers@'.$this->record_generators[$generatorId]['customer_engine']; $this->CustomerSoapEngine = new SoapEngine($customer_engine,$soapEngines,$login_credentials); $_customer_class = $this->CustomerSoapEngine->records_class; $this->customerRecords = new $_customer_class($this->CustomerSoapEngine); } } else { printf ("Error: customer_engine %s does not exist",$this->record_generators[$generatorId]['customer_engine']); } if ($_REQUEST['reseller_filter']) $this->template['reseller']=intval($_REQUEST['reseller_filter']); if ($_REQUEST['customer_filter']) $this->template['customer']=intval($_REQUEST['customer_filter']); } function showGeneratorForm() { print "

"; printf ("",$_SERVER['PHP_SELF']); print ""; print ""; printf ("", $this->tel2enum($range->id->prefix,$range->id->tld)); if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($item == 'nameservers') { foreach ($range->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$range->$item; } if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($item == 'nameservers') { foreach ($range->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$range->$item; } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); }else if ($this->Fields[$item]['readonly']) { printf ("", $item_name, $item_value, $this->Fields[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } } printf ("",$range->id->tld); printf ("",$range->id->prefix); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
DNS zone%s
%s %s
%s %s
%s %s
%s %s %s
%s %s
"; } function updateRecord () { //print "

Updating range ..."; if (!$_REQUEST['prefix_filter'] || !$_REQUEST['tld_filter']) return; $rangeid=array('prefix' => $_REQUEST['prefix_filter'], 'tld' => $_REQUEST['tld_filter'] ); if (!$range = $this->getRecord($rangeid)) { return false; } $range_old=$range; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $range->$item = intval($_REQUEST[$var_name]); } else if ($item == 'nameservers') { $_txt=trim($_REQUEST[$var_name]); if (!strlen($_txt)) { unset($range->$item); } else { $_nameservers=array(); $_lines=explode("\n",$_txt); foreach ($_lines as $_line) { $_ns=trim($_line); $_nameservers[]=$_ns; } $range->$item=$_nameservers; } } else { $range->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name=$item.'_form'; if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $range->$item = intval($_REQUEST[$var_name]); } else { $range->$item = trim($_REQUEST[$var_name]); } } } $function=array('commit' => array('name' => 'updateRange', 'parameters' => array($range), 'logs' => array('success' => sprintf('ENUM range +%s under %s has been updated',$rangeid['prefix'],$rangeid['tld']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($rangeid) { // Filter if (!$rangeid['prefix'] || !$rangeid['tld']) { print "Error in getRecord(): Missing prefix or tld"; return false; } $filter=array('prefix' => $rangeid['prefix'], 'tld' => $rangeid['tld'] ); // Range $range=array('start' => 0, 'count' => 1 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->ranges[0]){ return $result->ranges[0]; } else { return false; } } } } class EnumMappings extends Records { var $default_ttl = 3600; var $default_priority = 5; var $sortElements=array('changeDate' => 'Change date', 'number' => 'Number', 'tld' => 'TLD' ); var $ranges=array(); var $FieldsReadOnly=array( 'customer', 'reseller' ); var $Fields=array( 'owner' => array('type'=>'integer'), 'info' => array('type'=>'string') ); var $mapping_fields=array('id' => 'integer', 'type' => 'string', 'mapto' => 'string', 'priority' => 'integer', 'ttl' => 'integer' ); var $NAPTR_services=array( "sip" => array("service"=>"sip", "webname"=>"SIP", "schemas"=>array("sip:","sips:")), "mailto" => array("service"=>"mailto", "webname"=>"Email", "schemas"=>array("mailto:")), "web:http" => array("service"=>"web:http", "webname"=>"WEB (http)", "schemas"=>array("http://")), "web:https" => array("service"=>"web:https", "webname"=>"WEB (https)", "schemas"=>array("https://")), "x-skype:callto" => array("service"=>"x-skype:callto", "webname"=>"Skype", "schemas"=>array("callto:")), "h323" => array("service"=>"h323", "webname"=>"H323", "schemas"=>array("h323:")), "iax" => array("service"=>"iax", "webname"=>"IAX", "schemas"=>array("iax:")), "iax2" => array("service"=>"iax2", "webname"=>"IAX2", "schemas"=>array("iax2:")), "mms" => array("service"=>"mms", "webname"=>"MMS", "schemas"=>array("tel:","mailto:")), "sms" => array("service"=>"sms", "webname"=>"SMS", "schemas"=>array("tel:","mailto:")), "ems" => array("service"=>"ems", "webname"=>"EMS", "schemas"=>array("tel:","mailto:")), "im" => array("service"=>"im", "webname"=>"IM", "schemas"=>array("im:")), "npd:tel" => array("service"=>"npd+tel", "webname"=>"Portability", "schemas"=>array("tel:")), "void:mailto" => array("service"=>"void:mailto", "webname"=>"VOID(mail)", "schemas"=>array("mailto:")), "void:http" => array("service"=>"void:http", "webname"=>"VOID(http)", "schemas"=>array("http://")), "void:https" => array("service"=>"void:https", "webname"=>"VOID(https)", "schemas"=>array("https://")), "voice" => array("service"=>"voice", "webname"=>"Voice", "schemas"=>array("voice:","tel:")), "tel" => array("service"=>"tel", "webname"=>"Tel", "schemas"=>array("tel:")), "fax:tel" => array("service"=>"fax:tel", "webname"=>"Fax", "schemas"=>array("tel:")), "ifax:mailto" => array("service"=>"ifax:mailto", "webname"=>"iFax", "schemas"=>array("mailto:")), "pres" => array("service"=>"pres", "webname"=>"Presence", "schemas"=>array("pres:")), "ft:ftp" => array("service"=>"ft:ftp", "webname"=>"FTP", "schemas"=>array("ftp://")), "loc:http" => array("service"=>"loc:http", "webname"=>"GeoLocation", "schemas"=>array("http://")), "key:http" => array("service"=>"key:http", "webname"=>"Public key", "schemas"=>array("http://")), "key:https" => array("service"=>"key:https", "webname"=>"Public key (HTTPS)", "schemas"=>array("https://")) ); function EnumMappings($SoapEngine) { dprint("init EnumMappings"); if ($_REQUEST['range_filter']) { list($_prefix,$_tld_filter)= explode("@",$_REQUEST['range_filter']); if ($_prefix && !$_REQUEST['number_filter']) { $_number_filter=$_prefix.'%'; } else { $_number_filter=$_REQUEST['number_filter']; } } else { $_number_filter=$_REQUEST['number_filter']; $_tld_filter=trim($_REQUEST['tld_filter']); } $_number_filter=ltrim($_number_filter,'+'); $this->filters = array('number' => ltrim($_number_filter,'+'), 'tld' => $_tld_filter, 'range' => trim($_REQUEST['range_filter']), 'type' => trim($_REQUEST['type_filter']), 'mapto' => trim($_REQUEST['mapto_filter']), 'owner' => trim($_REQUEST['owner_filter']) ); $this->Records($SoapEngine); $this->getAllowedDomains(); } function listRecords() { $this->showSeachForm(); $filter=array('number' => $this->filters['number'], 'tld' => $this->filters['tld'], 'type' => $this->filters['type'], 'mapto' => $this->filters['mapto'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumbers'); // Call function $result = $this->SoapEngine->soapclient->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->numbers[$i]) break; $number = $result->numbers[$i]; $index=$this->next+$i+1; $j=1; foreach ($number->mappings as $_mapping) { unset($sip_engine); foreach (array_keys($this->login_credentials['reseller_filters']) as $_res) { if ($_res == $number->reseller) { if ($this->login_credentials['reseller_filters'][$_res]['sip_engine']) { $sip_engine=$this->login_credentials['reseller_filters'][$_res]['sip_engine']; break; } } } if (!$sip_engine) { if ($this->login_credentials['reseller_filters']['default']['sip_engine']) { $sip_engine=$this->login_credentials['reseller_filters']['default']['sip_engine']; } else { $sip_engine=$this->SoapEngine->sip_engine; } } if (preg_match("/^sip:(.*)$/",$_mapping->mapto,$m) && $this->sip_settings_page) { $url=sprintf('%s?account=%s&reseller=%s&sip_engine=%s', $this->sip_settings_page,urlencode($m[1]), $number->reseller,$sip_engine); if ($this->adminonly) $url .= sprintf('&adminonly=%s',$this->adminonly); foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; $url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element])); } $mapto=sprintf(" sip:%s",$url,$m[1]); } else { $mapto=sprintf("%s",$_mapping->mapto); } $_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s&mapto_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld), urlencode($_mapping->mapto) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['number_filter'] == $number->id->number && $_REQUEST['tld_filter'] == $number->id->tld && $_REQUEST['mapto_filter'] == $_mapping->mapto) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($j==1) { $_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld) ); if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($number->customer) ); if ($number->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($number->owner), $number->owner ); } else { $_owner_url=''; } printf(" ", $index, $_customer_url, $number->customer, $number->reseller, $_number_url, $number->id->number, $number->id->tld, $number->info, $_owner_url, ucfirst($_mapping->type), $_mapping->id, $mapto, $_mapping->ttl, $number->changeDate, $_url, $actionText ); } else { printf(" ", ucfirst($_mapping->type), $_mapping->id, $mapto, $_mapping->ttl, $number->changeDate, $_url, $actionText ); } $j++; } if (!is_array($number->mappings) || !count($number->mappings)) { $_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld), urlencode($_mapping->mapto) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['number_filter'] == $number->id->number && $_REQUEST['tld_filter'] == $number->id->tld && $_REQUEST['mapto_filter'] == $_mapping->mapto) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld) ); if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($number->customer) ); if ($number->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($number->owner), $number->owner ); } else { $_owner_url=''; } printf(" ", $index, $_customer_url, $number->customer, $number->reseller, $_number_url, $number->id->number, $number->id->tld, $number->info, $_owner_url, $number->changeDate, $_url, $actionText ); } printf(" "); $i++; } } print "
Range Owner Phone number TLD Info Owner Type Id Map to TTL Change date Actions
%s %s.%s +%s %s %s %s %s %s %s %s %s %s
%s %s %s %s %s %s
%s %s.%s +%s %s %s %s %s %s
"; if ($this->rows == 1 ) { $this->showRecord($number); } else { $this->showPagination($maxrows); } return true; } } function getLastNumber() { // Filter $filter=array('number' => '' ); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumbers'); // Call function $result = $this->SoapEngine->soapclient->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->total) { $number = array('number' => $result->numbers[0]->id->number, 'tld' => $result->numbers[0]->id->tld, 'mappings' => $result->numbers[0]->mappings ); return $number; } } return false; } function showSeachFormCustom() { /* print " "; */ printf ("

Number
",$_REQUEST['number_filter']); printf ("
Map to"); print " "; printf ("
",$this->filters['mapto']); printf ("
Owner
",$this->filters['owner']); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['number']) { $number=$dictionary['number']; } else { $number=$this->filters['number']; } if ($dictionary['tld']) { $tld=$dictionary['tld']; } else { $tld=$this->filters['tld']; } if ($dictionary['mapto']) { $mapto=$dictionary['mapto']; } else { $mapto=$this->filters['mapto']; } if (!strlen($number) || !strlen($tld)) { print "

Error: missing ENUM number or TLD "; return false; } $enum_id=array('number' => $number, 'tld' => $tld ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $result = $this->SoapEngine->soapclient->getNumber($enum_id); if (!(new PEAR)->isError($result)) { // the number exists and we make an update $result_new=$result; if (count($result->mappings) > 1) { foreach ($result->mappings as $_mapping) { if ($_mapping->mapto != $mapto) { $mappings_new[]=array('type' => $_mapping->type, 'mapto' => $_mapping->mapto, 'ttl' => $_mapping->ttl, 'priority' => $_mapping->priority, 'id' => $_mapping->id ); } } if (!is_array($mappings_new)) $mappings_new = array(); $result_new->mappings=$mappings_new; $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($result_new), 'logs' => array('success' => sprintf('ENUM mapping %s has been deleted',$mapto))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } else { $function=array('commit' => array('name' => 'deleteNumber', 'parameters' => array($enum_id), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$number,$tld))), ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } unset($this->filters); } else { return false; } } function showAddForm() { if ($this->selectionActive) return; //if ($this->adminonly && !$this->filters['reseller']) return; if (!count($this->ranges)) { //print "

You must create at least one ENUM range before adding ENUM numbers"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; if ($this->adminonly) { printf (" ",$this->filters['reseller']); } print "
"; printf (" Number"); print ""; if ($_REQUEST['number']) { printf ("",$_REQUEST['number']); } else if ($_number=$this->getCustomerProperty('enum_numbers_last_number')) { $_prefix=$_range['prefix']; preg_match("/^$_prefix(.*)/",$_number,$m); printf ("",$m[1]); } else { printf (""); } print "
"; printf ("Map to"); print " "; if ($_REQUEST['type']) { $selected_naptr_service[$_REQUEST['type']]='selected'; } else if ($_type=$this->getCustomerProperty('enum_numbers_last_type')) { $selected_naptr_service[$_type]='selected'; } printf (" ",$_REQUEST['mapto']); print "
"; print "TTL"; print ""; if ($_REQUEST['ttl']) { printf ("
",$_REQUEST['ttl']); } else if ($_ttl=$this->getCustomerProperty('enum_numbers_last_ttl')) { printf ("
",$_ttl); } else { printf (""); } printf ("
Owner
",$_REQUEST['owner']); printf ("
Info
",$_REQUEST['info']); $this->printHiddenFormElements(); print "
"; } function getAllowedDomains() { // Filter $filter=array('prefix' => '', 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 200 ); // Order $orderBy = array('attribute' => 'prefix', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach($result->ranges as $range) { $this->ranges[]=array('prefix' => $range->id->prefix, 'tld' => $range->id->tld, 'minDigits' => $range->minDigits, 'maxDigits' => $range->maxDigits ); if (in_array($range->id->tld,$this->allowedDomains)) continue; $this->allowedDomains[]=$range->id->tld; $seen[$range->id->tld]++; } if (!$seen[$this->SoapEngine->default_enum_tld]) { $this->allowedDomains[]=$this->SoapEngine->default_enum_tld; } } } function addRecord($dictionary=array()) { $prefix=''; if ($dictionary['range']) { list($prefix,$tld)=explode('@',trim($dictionary['range'])); $this->skipSaveProperties=true; } else if ($dictionary['tld']) { $tld = $dictionary['tld']; } else if ($_REQUEST['range']) { list($prefix,$tld)=explode('@',trim($_REQUEST['range'])); } else { $tld = trim($_REQUEST['tld']); } if ($dictionary['number']) { $number = $dictionary['number']; } else { $number = trim($_REQUEST['number']); } $number=$prefix.$number; if (!strlen($tld)) { $tld=$this->SoapEngine->default_enum_tld; } if (!strlen($tld) || !strlen($number) || !is_numeric($number)) { printf ("

Error: Missing TLD or number. "); return false; } if ($dictionary['ttl']) { $ttl = intval($dictionary['ttl']); } else { $ttl = intval(trim($_REQUEST['ttl'])); } if (!$ttl) $ttl=3600; if ($dictionary['priority']) { $priority = intval($dictionary['priority']); } else { $priority = intval(trim($_REQUEST['priority'])); } if ($dictionary['owner']) { $owner = intval($dictionary['owner']); } else { $owner = intval(trim($_REQUEST['owner'])); } if ($dictionary['info']) { $info = $dictionary['info']; } else { $info = trim($_REQUEST['info']); } if (!$priority) $priority=5; $enum_id=array('number' => $number, 'tld' => $tld); if ($dictionary['mapto']) { $mapto = $dictionary['mapto']; } else { $mapto = trim($_REQUEST['mapto']); } if ($dictionary['type']) { $type = $dictionary['type']; } else { $type = trim($_REQUEST['type']); } if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else { $_scheme = ''; $_value = $mapto; } if (!$_value) { $lastNumber=$this->getLastNumber(); foreach($lastNumber['mappings'] as $_mapping) { if ($_mapping->type == trim($type)) { if (preg_match("/^(.*)@(.*)$/",$_mapping->mapto,$m)) { $_value = $number.'@'.$m[2]; break; } } } } if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) { $_scheme=$this->NAPTR_services[trim($type)]['schemas'][0]; } $mapto=$_scheme.$_value; $enum_number=array('id' => $enum_id, 'owner' => $owner, 'info' => $info, 'mappings' => array(array('type' => $type, 'mapto' => $mapto, 'ttl' => $ttl, 'priority' => $priority ) ) ); if (!$this->skipSaveProperties=true) { $_p=array( array('name' => 'enum_numbers_last_range', 'category' => 'web', 'value' => $_REQUEST['range'], 'permission' => 'customer' ), array('name' => 'enum_numbers_last_type', 'category' => 'web', 'value' => "$type", 'permission' => 'customer' ), array('name' => 'enum_numbers_last_number', 'category' => 'web', 'value' => "$number", 'permission' => 'customer' ), array('name' => 'enum_numbers_last_ttl', 'category' => 'web', 'value' => "$ttl", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $result = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); if ($error_fault->detail->exception->errorcode == "3002") { $function=array('commit' => array('name' => 'addNumber', 'parameters' => array($enum_number), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been added',$number,$tld))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } } else { // the number exists and we make an update $result_new=$result; foreach ($result->mappings as $_mapping) { $mappings_new[]=array('type' => $_mapping->type, 'mapto' => $_mapping->mapto, 'ttl' => $_mapping->ttl, 'priority' => $_mapping->priority, 'id' => $_mapping->id ); if ($_mapping->mapto == $mapto) { printf ("

Info: ENUM mapping %s for number %s already exists",$mapto,$number); return $result; } } $mappings_new[]=array('type' => trim($type), 'mapto' => $mapto, 'ttl' => intval(trim($_REQUEST['ttl'])), 'priority'=> intval(trim($_REQUEST['priority'])), ); // add mapping $result_new->mappings=$mappings_new; $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($result_new), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$number,$tld))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } function getRecordKeys() { // Filter $filter=array('number' => $this->filters['number'], 'tld' => $this->filters['tld'], 'type' => $this->filters['type'], 'mapto' => $this->filters['mapto'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 1000 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumberss'); // Call function $result = $this->SoapEngine->soapclient->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->numbers as $number) { $this->selectionKeys[]=array('number' => $number->id->number, 'tld' => $number->id->tld); } return true; } } function showRecord($number) { print ""; print ""; print ""; print ""; print ""; print ""; print ""; print " "; print ""; print "
"; print "

Number

"; print "
"; print "

Mappings

"; print "
"; print ""; printf ("",$_SERVER['PHP_SELF']); print ""; printf ("", $this->tel2enum($number->id->number,$number->id->tld)); foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $number->$item ); } else { printf ("", $item_name, $item, $number->$item ); } } printf ("",$number->id->tld); printf ("",$number->id->number); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
DNS name%s
%s
%s
"; print "
"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; foreach ($number->mappings as $_mapping) { $j++; unset($selected_type); print ""; print ""; printf ("",$_mapping->id,$_mapping->id); $selected_type[$_mapping->type]='selected'; printf (" "; printf (" ", $_mapping->mapto, $_mapping->ttl ); print ""; } $j++; print ""; print ""; print ""; printf (" "; printf (" " ); print ""; print "
IdTypeMap toTTL
$j%d
"; print "
"; } function getRecord($enumid) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $result = $this->SoapEngine->soapclient->getNumber($enumid); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return $result; } } function updateRecord () { //print "

Updating number ..."; if (!$_REQUEST['number_filter'] || !$_REQUEST['tld_filter']) return; $enumid=array('number' => $_REQUEST['number_filter'], 'tld' => $_REQUEST['tld_filter'] ); if (!$number = $this->getRecord($enumid)) { return false; } $number_old=$number; $new_mappings=array(); /* foreach ($number->mappings as $_mapping) { foreach (array_keys($this->mapping_fields) as $field) { if ($this->mapping_fields[$field] == 'integer') { $new_mapping[$field]=intval($_mapping->$field); } else { $new_mapping[$field]=$_mapping->$field; } } $new_mappings[]=$new_mapping; } */ $j=0; while ($j< count($_REQUEST['mapping_type'])) { $mapto = $_REQUEST['mapping_mapto'][$j]; $type = $_REQUEST['mapping_type'][$j]; $id = $_REQUEST['mapping_id'][$j]; $ttl = intval($_REQUEST['mapping_ttl'][$j]); $priority = intval($_REQUEST['mapping_priority'][$j]); if (!$ttl) $ttl = $this->default_ttl; if (!$priority) $priority = $this->default_priority; if (strlen($mapto)) { if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else { $_scheme = ''; $_value = $mapto; } reset($this->NAPTR_services); if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) { $_scheme=$this->NAPTR_services[trim($type)]['schemas'][0]; } $mapto=$_scheme.$_value; $new_mappings[]=array( 'type' => $type, 'ttl' => $ttl, 'id' => intval($id), 'mapto' => $mapto, 'priority' => $priority ); } $j++; } $number->mappings=$new_mappings; if (!is_array($number->mappings)) $number->mappings=array(); foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $number->$item = intval($_REQUEST[$var_name]); } else { $number->$item = trim($_REQUEST[$var_name]); } } //print_r($number); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$enumid['number'],$enumid['tld']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showTextBeforeCustomerSelection() { print _("Range owner"); } } class DnsZones extends Records { var $FieldsAdminOnly=array( 'reseller' => array('type'=>'integer', 'help' => 'Zone owner') ); var $Fields=array( 'customer' => array('type'=>'integer', 'help' => 'Zone owner' ), 'serial' => array('type'=>'integer', 'help'=>'Serial number', 'readonly' => 1 ), 'email' => array('type'=>'string', 'help'=>'Administrator address' ), 'ttl' => array('type'=>'integer', 'help'=>'Time to live of SOA record' ), 'minimum' => array('type'=>'integer', 'help'=>'Default time to live period' ), 'retry' => array('type'=>'integer', 'help'=>'Retry transfer period' ), 'expire' => array('type'=>'integer', 'help'=>'Expire period' ), 'info' => array('type'=>'string', 'help' =>'Zone description' ) ); function DnsZones($SoapEngine) { dprint("init DnsZones"); $this->filters = array( 'name' => trim($_REQUEST['name_filter']), 'info' => trim($_REQUEST['info_filter']) ); $this->Records($SoapEngine); $this->sortElements=array('changeDate' => 'Change date', 'name' => 'Name' ); $this->Fields['nameservers'] = array('type'=>'text', 'name'=>'Name servers', 'help'=>'Authoritative name servers' ); } function showAfterEngineSelection () { if ($this->SoapEngine->name_servers) { //printf (" Available name servers: %s",$this->SoapEngine->name_servers); } } function listRecords() { $this->showSeachForm(); // Filter $filter=array('name' => $this->filters['name'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->zones[$i]) break; $zone = $result->zones[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&name_filter=%s", urlencode($this->SoapEngine->service), urlencode($zone->name) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$zone->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['name_filter'] == $zone->name) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $zone_url=sprintf('%s&service=%s&name_filter=%s', $this->url, $this->SoapEngine->service, $zone->name ); $records_url = $this->url.sprintf("&service=dns_records@%s&zone_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($zone->name) ); if ($this->adminonly) $zone_url .= sprintf("&reseller_filter=%s",$zone->reseller); if ($this->adminonly) $records_url .= sprintf("&reseller_filter=%s",$zone->reseller); $customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($zone->customer) ); sort($zone->nameservers); $ns_text=''; foreach ($zone->nameservers as $ns) { $ns_text.= $ns." "; } printf(" ", $index, $customer_url, $zone->customer, $zone->reseller, $zone_url, $zone->name, $zone->email, $zone->info, $records_url, $zone->serial, $zone->ttl, $zone->changeDate, $_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Zone Administrator Info Serial Default TTL Change date Actions
%s %s.%s %s %s %s Records %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($zone); } else { $this->showPagination($maxrows); } return true; } } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['name'])) { print "

Error: missing Dns zone name "; return false; } $name=$this->filters['name']; $function=array('commit' => array('name' => 'deleteZone', 'parameters' => array($name), 'logs' => array('success' => sprintf('Dns zone %s has been deleted',$this->filters['name']) ) ) ); unset($this->filters); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showAddForm() { if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
DNS zone
",$_REQUEST['name']); $this->printHiddenFormElements(); printf (" Import DNS zones from file:
Select file Change Remove
" ); print "
"; } function addRecord($dictionary=array()) { $name = trim($_REQUEST['name']); $info = trim($_REQUEST['info']); $name_servers = trim($_REQUEST['name_servers']); if ($_FILES['import_file']['tmp_name']) { $content=fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']); //print_r($content); if (!$imported_data=json_decode($content, true)) { printf ("

Error: reading imported data. "); return false; } //print_r($imported_data); if (!in_array('dns_zones', array_keys($imported_data))) { printf ("

Error: Missing zones in imported data. "); return false; } if (!in_array('dns_records', array_keys($imported_data))) { return false; printf ("

Error: Missing records in imported data. "); } foreach($imported_data['customers'] as $customer) { // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $customer['credit'] = floatval($customer['credit']); $customer['balance'] = floatval($customer['balance']); // Call function $this->log_action('addAccount'); $result = $this->SoapEngine->soapclientCustomers->addAccount($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 5001) { $result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } else { printf('

Customer %s has been updated',$customer['id']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } } else { printf('

Customer %s has been added',$customer['id']); } } $name_servers = array(); foreach($imported_data['dns_zones'] as $zone) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addZone'); $result = $this->SoapEngine->soapclient->addZone($zone); $name_servers[$zone['name']] = $zone['nameservers']; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 7001) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateZone'); $result = $this->SoapEngine->soapclient->updateZone($zone); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } else { printf('

Zone %s has been updated',$zone['name']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } } else { printf('

Zone %s has been added',$zone['name']); } } $added = 0; $updated = 0; foreach($imported_data['dns_records'] as $record) { flush(); if (in_array($record['name'], $name_servers[$record['zone']]) && $record['type'] == "A") { continue; } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addRecord'); $result = $this->SoapEngine->soapclient->addRecord($record); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 7003) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateRecord'); $result = $this->SoapEngine->soapclient->updateRecord($record); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } else { $added += 1; } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } } else { $added += 1; } } printf('

%d DNS records added and %d updated',$added, $updated); return true; } else { if (isset($this->SoapEngine->allow_none_local_dns_zones)) { $allow_none_local_dns_zones = $this->SoapEngine->allow_none_local_dns_zones; } else { $allow_none_local_dns_zones = false; } if (!strlen($name)) { printf ("

Error: Missing zone name.

"); return false; } $lookup1 = dns_get_record($name); //dprint_r($lookup1); $ns_array1=explode(" ",trim($this->SoapEngine->name_servers)); if (empty($lookup1) || $allow_none_local_dns_zones){ $valid = 1; } else { $valid = 0; foreach($lookup1 as $lrecord){ if ($lrecord['type'] == 'NS') { if(in_array($lrecord['target'],$ns_array1)){ $valid = 1 ; } } } } if ($valid==0){ printf ("

Error: DNS zone already exists on other server. Please contact our support if you plan to transfer this DNS zone to this system.

"); return false; } if (is_numeric($prefix)) { printf ("

Error: Numeric zone names are not allowed. Use ENUM port instead. "); return false; } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!trim($_REQUEST['ttl'])) { $ttl=3600; } else { $ttl=intval(trim($_REQUEST['ttl'])); } if ($name_servers) { $ns_array=explode(" ",trim($name_servers)); } else if ($this->login_credentials['login_type'] != 'admin' && $this->SoapEngine->name_servers){ $ns_array=explode(" ",trim($this->SoapEngine->name_servers)); } else { $ns_array=array(); } $zone=array( 'name' => $name, 'ttl' => $ttl, 'info' => $info, 'customer' => intval($customer), 'reseller' => intval($reseller), 'nameservers' => $ns_array ); $function=array('commit' => array('name' => 'addZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('DNS zone %s has been added',$name))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } function showSeachFormCustom() { printf ("

DNS zone
",$this->filters['name']); printf ("
Info
",$this->filters['info']); } function showRecord($zone) { print ""; print "
"; printf ("",$_SERVER['PHP_SELF']); print ""; print ""; printf ("",$zone->name); if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($item == 'nameservers') { foreach ($zone->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$zone->$item; } if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($item == 'nameservers') { foreach ($zone->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$zone->$item; } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } else if ($this->Fields[$item]['readonly']) { printf ("", $item_name, $item_value, $this->Fields[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } } printf ("",$zone->id->tld); printf ("",$zone->id->prefix); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
DNS zone%s
%s %s
%s %s
%s %s
%s %s %s
%s %s
"; } function updateRecord () { if (!$_REQUEST['name_filter']) return; //dprintf ("

Updating zone %s...",$_REQUEST['name_filter']); $filter=array('name' => $_REQUEST['name_filter']); if (!$zone = $this->getRecord($filter)) { return false; } $zone_old=$zone; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $zone->$item = intval($_REQUEST[$var_name]); } else if ($item == 'nameservers') { $_txt=trim($_REQUEST[$var_name]); if (!strlen($_txt)) { unset($zone->$item); } else { $_nameservers=array(); $_lines=explode("\n",$_txt); foreach ($_lines as $_line) { $_ns=trim($_line); $_nameservers[]=$_ns; } $zone->$item=$_nameservers; } } else { $zone->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name=$item.'_form'; if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $zone->$item = intval($_REQUEST[$var_name]); } else { $zone->$item = trim($_REQUEST[$var_name]); } } } $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('DNS zone %s has been updated',$filter['name']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($zone) { // Filter if (!$zone['name']) { print "Error in getRecord(): Missing zone name"; return false; } $filter=array('name' => $zone['name']); // Range $range=array('start' => 0, 'count' => 1 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->zones[0]){ return $result->zones[0]; } else { return false; } } } function getRecordKeys() { // Filter $filter=array('name' => $this->filters['name'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 200 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); // Call function $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->zones as $zone) { $this->selectionKeys[]=array('name' => $zone->name); } return true; } } function hide_html() { if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') { return true; } else { return false; } } } class DnsRecords extends Records { var $max_zones_selection = 50; var $typeFilter = false; var $default_ttl = 3600; var $fancy = false; var $sortElements = array( 'changeDate' => 'Change date', 'type' => 'Type', 'name' => 'Name' ); var $FieldsReadOnly = array( 'customer', 'reseller' ); var $Fields = array( 'type' => array('type'=>'string'), 'priority' => array('type'=>'integer'), 'value' => array('type'=>'string'), 'ttl' => array('type'=>'integer') ); var $recordTypes = array( 'A' => 'IP address', 'AAAA' => 'IP v6 address', 'CNAME' => 'Hostname alias', 'MX' => 'Mail server address', 'SRV' => 'Server resource', 'NS' => 'Name server address', 'NAPTR' => 'Name authority', 'PTR' => 'Reverse IP address', 'TXT' => 'Text', 'LOC' => 'Geo location' ); var $havePriority = array('MX','SRV','NAPTR'); var $addRecordFunction = 'addRecord'; var $deleteRecordFunction = 'deleteRecord'; var $updateRecordFunction = 'updateRecord'; var $getRecordsFunction = 'getRecords'; var $getRecordFunction = 'getRecord'; var $recordTypesTemplate = array( 'sip2sip' => array( 'name' => 'SIP2SIP infrastructure', 'records' => array( 'naptr1' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => '20 100 "s" "SIP+D2T" "" _sip._tcp' ), 'naptr2' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => '30 100 "s" "SIP+D2U" "" _sip._udp' ), 'naptr3' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => '10 100 "s" "SIPS+D2T" "" _sips._tcp' ), 'srv1' => array( 'name' => '_sip._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => '100 5060 proxy.sipthor.net' ), 'srv2' => array( 'name' => '_sip._udp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => '100 5060 proxy.sipthor.net' ), 'srv3' => array( 'name' => '_sips._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => '100 5061 proxy.sipthor.net' ), 'srv4' => array( 'name' => '_stun._udp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 3478 stun1.sipthor.net' ), 'srv5' => array( 'name' => '_stun._udp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 3478 stun2.sipthor.net' ), 'srv6' => array( 'name' => '_msrps._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 2855 msrprelay.sipthor.net' ), 'txt1' => array( 'name' => 'xcap', 'type' => 'TXT', 'priority' => '10', 'value' => 'https://xcap.sipthor.net/xcap-root' ) ), ), 'siptcp' => array( 'name' => 'SIP - TCP transport', 'records' => array( 'naptr' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '3600', 'value' => '10 100 "s" "SIP+D2T" "" _sip._tcp' ), 'srv' => array( 'name' => '_sip._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '3600', 'value' => '100 5060 #VALUE#|10 5060 sip' ) ), ), 'siptls' => array( 'name' => 'SIP - TLS transport', 'records' => array( 'naptr' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '3600', 'value' => '20 100 "s" "SIPS+D2T" "" _sips._tcp' ), 'srv' => array( 'name' => '_sips._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '3600', 'value' => '100 5061 #VALUE#|10 5061 sip' ) ) ), 'sipudp' => array( 'name' => 'SIP - UDP transport', 'records' => array( 'naptr' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '3600', 'value' => '30 100 "s" "SIP+D2U" "" _sip._udp' ), 'srv' => array( 'name' => '_sip._udp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '3600', 'value' => '100 5060 #VALUE#|10 5060 sip' ) ), ), 'stun' => array( 'name' => 'STUN - NAT mirror', 'records' => array( 'srv' => array( 'name' => '_stun._udp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 3478 #VALUE#|10 3478 stun' ) ), ), 'xmpp-server' => array( 'name' => 'XMPP server', 'records' => array( 'srv' => array( 'name' => '_xmpp-server._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5269 #VALUE#|10 5269 xmpp' ), 'srv1' => array( 'name' => '_jabber._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5269 #VALUE#|10 5269 xmpp' ) ), ), 'xmpp-client' => array( 'name' => 'XMPP client', 'records' => array( 'srv' => array( 'name' => '_xmpp-client._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5222 #VALUE#|10 5222 xmpp' ) ), ), 'msrp' => array( 'name' => 'MSRP - IM relay', 'records' => array( 'srv' => array( 'name' => '_msrps._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 2855 msrprelay' ) ) ), 'sipthor' => array( 'name' => 'SIP - Thor network', 'records' => array( 'eventserver' => array( 'name' => '_eventserver._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 8000 eventserver' ), 'sipserver' => array( 'name' => '_sip._udp', 'type' => 'SRV', 'priority' => '10', 'value' => '30 5060 proxy' ), 'sipns1' => array( 'name' => 'proxy', 'type' => 'NS', 'value' => 'ns1' ), 'sipns2' => array( 'name' => 'proxy', 'type' => 'NS', 'value' => 'ns2' ), 'sipns3' => array( 'name' => 'proxy', 'type' => 'NS', 'value' => 'ns3' ), 'ngnproserver' => array( 'name' => '_ngnpro._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 9200 ngnpro' ), 'ngnns1' => array( 'name' => 'ngnpro', 'type' => 'NS', 'value' => 'ns1' ), 'ngnns2' => array( 'name' => 'ngnpro', 'type' => 'NS', 'value' => 'ns2' ), 'ngnns3' => array( 'name' => 'ngnpro', 'type' => 'NS', 'value' => 'ns3' ), 'xcapserver' => array( 'name' => '_xcap._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 443 xcap' ), 'xcapns1' => array( 'name' => 'xcap', 'type' => 'NS', 'value' => 'ns1' ), 'xcapns2' => array( 'name' => 'xcap', 'type' => 'NS', 'value' => 'ns2' ), 'xcapns3' => array( 'name' => 'xcap', 'type' => 'NS', 'value' => 'ns3' ), 'msrpserver' => array( 'name' => '_msrps._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 2855 msrprelay' ), 'msrpns1' => array( 'name' => 'msrprelay', 'type' => 'NS', 'value' => 'ns1' ), 'msrpns2' => array( 'name' => 'msrprelay', 'type' => 'NS', 'value' => 'ns2' ), 'msrpns3' => array( 'name' => 'msrprelay', 'type' => 'NS', 'value' => 'ns3' ), 'voicemail' => array( 'name' => '_voicemail._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 9200 voicemail' ), 'vmns1' => array( 'name' => 'voicemail', 'type' => 'NS', 'value' => 'ns1' ), 'vmns2' => array( 'name' => 'voicemail', 'type' => 'NS', 'value' => 'ns2' ), 'vmns3' => array( 'name' => 'voicemail', 'type' => 'NS', 'value' => 'ns3' ) ) ) ); function DnsRecords($SoapEngine) { dprint("init DnsRecords"); $_name = trim($_REQUEST['name_filter']); if (strlen($_name) && !strstr($_name,'.') && !strstr($_name,'%')) { $_name .= '%'; } if ($this->typeFilter) { $this->filters = array( 'id' => trim($_REQUEST['id_filter']), 'zone' => trim($_REQUEST['zone_filter']), 'name' => $_name, 'type' => $this->typeFilter, 'value' => trim($_REQUEST['value_filter']), 'owner' => trim($_REQUEST['owner_filter']) ); } else { $this->filters = array( 'id' => trim($_REQUEST['id_filter']), 'zone' => trim($_REQUEST['zone_filter']), 'name' => $_name, 'type' => trim($_REQUEST['type_filter']), 'value' => trim($_REQUEST['value_filter']), 'owner' => trim($_REQUEST['owner_filter']) ); } $this->Records($SoapEngine); $this->getAllowedDomains(); } function listRecords() { $this->showSeachForm(); if ($this->typeFilter) { $filter = array( 'id' => intval($this->filters['id']), 'zone' => $this->filters['zone'], 'name' => $this->filters['name'], 'type' => $this->typeFilter, 'value' => $this->filters['value'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); } else { $filter = array( 'id' => intval($this->filters['id']), 'zone' => $this->filters['zone'], 'name' => $this->filters['name'], 'type' => $this->filters['type'], 'value' => $this->filters['value'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); } // Range $range = array( 'start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array( 'attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action($this->getRecordsFunction); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows > 1 && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found. Click on record id to edit the values.

"; if ($this->fancy) { print " "; } else { print " "; } if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->records[$i]) { break; } $record = $result->records[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf( "&service=%s&action=Delete&name_filter=%s&zone_filter=%s&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($record->name), urlencode($record->zone), urlencode($record->id) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$record->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $record->id) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_customer_url = $this->url.sprintf( "&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($record->customer) ); $_zone_url = $this->url.sprintf( "&service=dns_zones@%s&name_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($record->zone) ); if ($this->adminonly) { $_zone_url.= sprintf("&reseller_filter=%s", $record->reseller); } $_record_url = $this->url.sprintf( "&service=%s@%s&zone_filter=%s&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($this->SoapEngine->soapEngine), urlencode($record->zone), urlencode($record->id) ); if ($this->adminonly) $_record_url.= sprintf ("&reseller_filter=%s",$record->reseller); if ($record->owner) { $_owner_url = sprintf( "%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($record->owner), $record->owner ); } else { $_owner_url=''; } if ($this->fancy) { printf( " ", $index, $_customer_url, $record->customer, $record->reseller, $_zone_url, $record->zone, $_record_url, $record->id, $record->name, $record->type, $record->value, $record->owner, $record->changeDate, $_url, $actionText ); } else { printf(" ", $index, $_customer_url, $record->customer, $record->reseller, $_zone_url, $record->zone, $_record_url, $record->id, $record->name, $record->type, $record->priority, $record->value, $record->ttl, $record->changeDate, $_url, $actionText ); } $i++; } } print "
Zone owner Zone Id Name Type Value Owner Change date Actions
Zone owner Zone Id Name Type Priority Value TTL Change date Actions
%s %s.%s %s %s %s %s %s %s %s %s
%s %s.%s %s %s %s %s %s %s %s %s %s
"; if ($this->rows == 1 ) { $this->showRecord($record); } else { $this->showPagination($maxrows); } return true; } } function showSeachFormCustom() { printf( "

Record Id
", $this->filters['id'] ); printf( "
Name
", $this->filters['name'] ); if (count($this->allowedDomains) > 0) { $selected_zone[$this->filters['zone']]='selected'; print ""; } else { printf( "
DNS zone
", $this->filters['zone'] ); } if ($this->typeFilter) { printf( " Type %s", $this->typeFilter, $this->typeFilter ); } else { $selected_type[$this->filters['type']]='selected'; echo " "; } printf( "
Value
", $this->filters['value'] ); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id=$dictionary['id']; } else { $id=$this->filters['id']; } if (!$id) { print "

Missing record id. "; return false; } $function = array( 'commit' => array( 'name' => $this->deleteRecordFunction, 'parameters' => array($id), 'logs' => array('success' => sprintf('DNS record %s has been deleted',$id)) ) ); $zone=$this->filters['zone']; unset($this->filters); $this->filters['zone']=$zone; $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showAddForm() { /* if ($this->adminonly) { if (!$this->filters['reseller']) { print "

To add a new record you must search first for a customer"; return; } } */ printf("

", $_SERVER['PHP_SELF']); print "
"; if ($this->adminonly) { printf( "", $this->filters['reseller'] ); } print "
Name "; printf( "
", trim($_REQUEST['name']) ); if (count($this->allowedDomains) > 0) { if ($_REQUEST['zone']) { $selected_zone[$_REQUEST['zone']]='selected'; } else if ($this->filters['zone']) { $selected_zone[$this->filters['zone']]='selected'; } else if ($_zone=$this->getCustomerProperty('dns_records_last_zone')) { $selected_zone[$_zone]='selected'; } print "."; } else { if ($_REQUEST['zone']) { $_zone_selected=$_REQUEST['zone']; } else if ($this->filters['zone']) { $_zone_selected=$this->filters['zone']; } else if ($_zone=$this->getCustomerProperty('dns_records_last_zone')) { $_zone_selected=$_zone; } printf( "
DNS zone
", $_zone_selected ); } if ($this->typeFilter) { printf("Type %s ",$this->typeFilter,$this->typeFilter); } else { print "
Type
"; } printf( "
Value
", trim($_REQUEST['value']) ); if (!$this->fancy) { printf( "
Priority
", trim($_REQUEST['priority']) ); } $this->printHiddenFormElements(); print "
"; } function getAllowedDomains() { // Filter $filter = array( 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range = array( 'start' => 0, 'count' => $this->max_zones_selection ); // Order $orderBy = array( 'attribute' => 'name', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { if ($result->total > $this->max_zones_selection) return false; foreach($result->zones as $zone) { if (in_array($zone->name,$this->allowedDomains)) continue; $this->allowedDomains[]=$zone->name; $seen[$zone->name]++; } } } function addRecord($dictionary=array()) { if ($this->typeFilter) { $type = $this->typeFilter; } else if ($dictionary['type']) { $type = $dictionary['type']; } else { $type = trim($_REQUEST['type']); } if ($dictionary['name']) { $name = $dictionary['name']; } else { $name = trim($_REQUEST['name']); } $name = rtrim($name,"."); if (preg_match("/^(.+)@(.*)$/", $name, $m)) { $zone = $m[2]; } else { if ($dictionary['zone']) { $zone=$dictionary['zone']; $this->skipSaveProperties=true; } else if ($_REQUEST['zone']) { $zone=$_REQUEST['zone']; } if ($type == 'MBOXFW') { $name .= '@'.$zone; } } if (!strlen($zone)) { if ($this->html) { echo "
Error: Missing zone name.
"; } return false; } $this->filters['zone']=$zone; if (!strlen($type)) { if ($this->html) { echo "
Error: Missing record type.
"; } return false; } if ($dictionary['value']) { $value = $dictionary['value']; } else { $value = trim($_REQUEST['value']); } $value=rtrim($value,"."); if ($this->adminonly) { if ($dictionary['reseller']) { } else if ($this->filters['reseller']) { } else { if ($this->html) { echo "
Error: Missing reseller, please first search zones for a given reseller
"; } return false; } } if ($dictionary['ttl']) { $ttl = intval($dictionary['ttl']); } else { $ttl = intval(trim($_REQUEST['ttl'])); } if (!$ttl) $ttl=3600; if ($dictionary['owner']) { $owner = intval($dictionary['owner']); } else { $owner = intval(trim($_REQUEST['owner'])); } if ($dictionary['priority']) { $priority = $dictionary['priority']; } else { $priority = trim($_REQUEST['priority']); } if (in_array($type,array_keys($this->recordTypes))) { // See RFC 1912 - Section 2.4 if (trim($name).trim($zone) == trim($zone) && $type == 'CNAME') { printf( "
Error: CNAME (%s) equal to zone name (%s) is not allowed
", trim($name).trim($zone), trim($zone) ); return false; } if (!strlen($value)) { if ($this->html) { echo "
Error: Missing record value.
"; } return false; } $record = array( 'name' => trim($name), 'zone' => trim($zone), 'type' => $type, 'value' => trim($value), 'owner' => intval($owner), 'ttl' => intval($ttl), 'priority' => intval($priority) ); if (!$this->skipSaveProperties=true) { $_p = array( array( 'name' => 'dns_records_last_zone', 'category' => 'web', 'value' => $_REQUEST['zone'], 'permission' => 'customer' ), array( 'name' => 'dns_records_last_type', 'category' => 'web', 'value' => "$type", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } $function = array( 'commit' => array( 'name' => $this->addRecordFunction, 'parameters' => array($record), 'logs' => array('success' => sprintf('DNS record %s under %s has been added',$name,$zone)) ) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($this->html) { $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); } syslog(LOG_NOTICE, $log); return false; } else { return true; } } else if (in_array($type,array_keys($this->recordTypesTemplate))) { $push_notifications_server = $this->getResellerProperty('push_notifications_server_private') or $this->getResellerProperty('push_notifications_server'); if ($type == "sip2sip" && $push_notifications_server) { if (preg_match("/^(.*):(\d+);transport=(.*)$/", $push_notifications_server, $m)) { $push_hostname = $m[1]; $push_port = $m[2]; $push_transport = $m[3]; if ($push_transport == "tls") { $naptr_type = "_sips._tcp"; $naptr_s = "SIPS+D2T"; } else if ($push_transport == "tcp") { $naptr_type = "_sip._tcp"; $naptr_s = "SIP+D2T"; } else { $naptr_type = "_sip._udp"; $naptr_s = "SIP+D2U"; } $this->recordTypesTemplate[$type]['records']['push_naptr'] = array( 'name' => 'push', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => sprintf('10 100 "s" "%s" "" %s.push', $naptr_s, $naptr_type) ); $this->recordTypesTemplate[$type]['records']['push_srv'] = array( 'name' => sprintf('%s.push', $naptr_type), 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => sprintf('100 %d %s', $push_port, $push_hostname) ); } } foreach (array_values($this->recordTypesTemplate[$type]['records']) as $_records) { $value_new=''; if (strlen($_records['value'])) { if (preg_match("/^_sip/",$_records['name'])) { if (!$value) { $value=$this->getCustomerProperty('dns_records_last_sip_server'); if (!$value) { $value = $this->getCustomerProperty('sip_proxy'); } if (!value) { $value = $this->SoapEngine->default_sip_proxy; } $save_new_value=false; } else { $save_new_value=true; } } $els=explode("|",$_records['value']); foreach ($els as $el) { if (preg_match("/#VALUE#/",$el)) { if ($value) { $value_new=preg_replace("/#VALUE#/",$value,$el); } else { continue; } } else { $value_new=$el; } break; } // save value if type sip server if ($save_new_value && $_records['name'] && preg_match("/^_sip/",$_records['name'])) { $_p = array( array( 'name' => 'dns_records_last_sip_server', 'category' => 'web', 'value' => $value, 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } } if (!in_array($_records['type'],array_keys($this->recordTypes))) { continue; } $record = array( 'name' => $_records['name'], 'zone' => trim($zone), 'type' => $_records['type'], 'value' => $value_new, 'owner' => intval($owner), 'ttl' => intval($_records['ttl']), 'priority' => intval($_records['priority']) ); //print_r($record); $function=array( 'commit' => array( 'name' => $this->addRecordFunction, 'parameters' => array($record), 'logs' => array( 'success' => sprintf('Dns %s record under %s has been added', $_records['type'], $zone) ) ) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($this->html) { $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); } syslog(LOG_NOTICE, $log); return false; } } } else { if ($this->html) { printf ("
Error: Invalid or missing record type.
"); } return false; } return true; } function getRecordKeys() { // Filter $filter = array( 'id' => intval($this->filters['id']), 'zone' => $this->filters['zone'], 'name' => $this->filters['name'], 'type' => $this->filters['type'], 'value' => $this->filters['value'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range = array( 'start' => 0, 'count' => 1000 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array( 'attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecords'); // Call function $result = $this->SoapEngine->soapclient->getRecords($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->records as $record) { $this->selectionKeys[]=array('id' => $record->id); } return true; } } function showRecord($record) { echo "

Record

"; printf("
", $_SERVER['PHP_SELF']); echo ""; printf( "
%s
", $record->name ); foreach (array_keys($this->Fields) as $item) { if (is_array($this->havePriority) && $item == 'priority' && !in_array($record->type,$this->havePriority)) { continue; } if ($this->Fields[$item]['name']) { $item_name = $this->Fields[$item]['name']; } else { $item_name = ucfirst($item); } if ($item == 'type') { $selected_type[$record->$item]='selected'; $select_box=sprintf(""; printf( "
%s
", $item_name, $select_box ); } else if ($this->Fields[$item]['type'] == 'text') { printf( "
", $item_name, $item, $record->$item ); } else { if ($record->type == 'NAPTR' and $item == 'value') { $help_text = 'Priority field will be used for the preference part of the value'; } else { $help_text = ''; } printf( "
", $item_name, $item, $record->$item ); if ($help_text) { printf("%s", $help_text); } echo "
"; } } printf("", $record->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); echo "
"; echo "
"; } function getRecord($id) { // Filter if (!$id) { print "Error in getRecord(): Missing record id"; return false; } $filter = array('id' => $id); // Range $range = array( 'start' => 0, 'count' => 1 ); // Order $orderBy = array( 'attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action($this->getRecordsFunction); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { if ($result->records[0]){ return $result->records[0]; } else { return false; } } } function updateRecord () { //print "

Updating record ..."; if (!$_REQUEST['id_filter']) return; if (!$record = $this->getRecord(intval($_REQUEST['id_filter']))) { return false; } $record_old=$record; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $record->$item = intval($_REQUEST[$var_name]); } else { $record->$item = trim($_REQUEST[$var_name]); } } $function=array('commit' => array('name' => $this->updateRecordFunction, 'parameters' => array($record), 'logs' => array('success' => sprintf('Record %s has been updated',$_REQUEST['id_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showTextBeforeCustomerSelection() { print _("Zone owner"); } } class FancyRecords extends DnsRecords { var $fancy = true; var $addRecordFunction = 'addFancyRecord'; var $deleteRecordFunction = 'deleteFancyRecord'; var $updateRecordFunction = 'updateFancyRecord'; var $getRecordsFunction = 'getFancyRecords'; var $getRecordFunction = 'getFancyRecord'; var $recordTypesTemplate=array(); var $Fields=array( 'type' => array('type'=>'string'), 'value' => array('type'=>'string') ); } class EmailAliases extends FancyRecords { var $recordTypes=array('MBOXFW' => 'Email alias'); var $typeFilter='MBOXFW'; } class UrlRedirect extends FancyRecords { var $recordTypes=array('URL' => 'URL forwarding'); var $typeFilter='URL'; } class TrustedPeers extends Records { function TrustedPeers($SoapEngine) { $this->filters = array('ip' => trim($_REQUEST['ip_filter']), 'description' => trim($_REQUEST['description_filter']) ); $this->Records($SoapEngine); $this->sortElements=array( 'changeDate' => 'Change date', 'description' => 'Description', 'ip' => 'IP address' ); } function listRecords() { $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('ip' => $this->filters['ip'], 'description' => $this->filters['description'] ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'description'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getTrustedPeers'); $result = $this->SoapEngine->soapclient->getTrustedPeers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found
+ "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->peers[$i]) break; $peer = $result->peers[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&ip_filter=%s", urlencode($this->SoapEngine->service), urlencode($peer->ip) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['ip_filter'] == $peer->ip) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($peer->reseller) ); printf(" + ", $index, $_customer_url, $peer->reseller, $peer->ip, $peer->protocol, + $peer->callLimit, $peer->description, $peer->changeDate, $_url, $actionText ); $i++; } } print "
Id Owner IP address ProtocolCall limit Description Change date Actions
%s %s %s %s %s %s%s %s
"; $this->showPagination($maxrows); return true; } } function showAddForm() { //if ($this->selectionActive) return; printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
IP address
"); + printf ("
Call limit
"); printf ("
Description
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['ipaddress']) { $ipaddress = $dictionary['ipaddress']; } else { $ipaddress = trim($_REQUEST['ipaddress']); } if ($dictionary['description']) { $description = $dictionary['description']; } else { $description = trim($_REQUEST['description']); } + if ($dictionary['callLimit']) { + $callLimit = $dictionary['callLimit']; + } else { + $callLimit = trim($_REQUEST['callLimit']); + } + if ($dictionary['owner']) { $owner = $dictionary['owner']; } else { $owner = trim($_REQUEST['owner']); } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!strlen($ipaddress) || !strlen($description)) { printf ("

Error: Missing IP or description. "); return false; } $peer=array( 'ip' => $ipaddress, 'description' => $description, + 'callLimit' => intval($callLimit), 'owner' => intval($_REQUEST['owner']), 'customer' => intval($customer), 'reseller' => intval($reseller) ); $function=array('commit' => array('name' => 'addTrustedPeer', 'parameters' => array($peer), 'logs' => array('success' => sprintf('Trusted peer %s has been added',$ipaddress))) ); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['ip'])) { print "

Error: missing IP address. "; return false; } $function=array('commit' => array('name' => 'deleteTrustedPeer', 'parameters' => array($this->filters['ip']), 'logs' => array('success' => sprintf('Trusted peer %s has been deleted',$this->filters['ip']))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

IP address
",$this->filters['ip']); printf ("
Description
",$this->filters['description']); } function showCustomerTextBox () { print "
Owner"; $this->showResellerForm('reseller'); print "
"; } function showTextBeforeCustomerSelection() { print "Owner"; } function showCustomerForm($name='customer_filter') { } } class Carriers extends Records { var $carriers=array(); var $Fields=array( 'id' => array('type'=>'integer', 'readonly' => true), 'name' => array('type'=>'string') ); var $sortElements=array( 'changeDate' => 'Change date', 'name' => 'Carrier' ); function Carriers($SoapEngine) { $this->filters = array('id' => trim($_REQUEST['id_filter']), 'name' => trim($_REQUEST['name_filter']) ); $this->Records($SoapEngine); } function showCustomerTextBox () { print "Reseller"; print ""; $this->showResellerForm('reseller'); print ""; } function listRecords() { $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array( 'id' => intval($this->filters['id']), 'name' => $this->filters['name'], 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "
$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->carriers[$i]) break; $carrier = $result->carriers[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($carrier->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $carrier->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($carrier->id), urlencode($carrier->reseller) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($carrier->reseller) ); $_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%d&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($carrier->id), urlencode($carrier->reseller) ); printf(" ", $index, $_customer_url, $carrier->reseller, $_url, $carrier->id, $carrier->name, $_gateway_url, $carrier->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Carrier Name Gateways Change date Actions
%s %s %s %s Gateways %s %s
"; if ($this->rows == 1) { $this->showRecord($carrier); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; print "
"; $this->showCustomerTextBox(); printf ("
Name
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['name']) { $name=$dictionary['name']; } else { $name = trim($_REQUEST['name']); } list($customer,$reseller)=$this->customerFromLogin($dictionary); $structure=array('name' => $name, 'reseller' => intval($reseller) ); if (!strlen($name)) { printf ("

Error: Missing name. "); return false; } $function=array('commit' => array('name' => 'addCarrier', 'parameters' => array($structure), 'logs' => array('success' => sprintf('Carrier %s has been added',$name))) ); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing carrier id "; return false; } $function=array('commit' => array('name' => 'deleteCarrier', 'parameters' => array(intval($id)), 'logs' => array('success' => sprintf('Carrier %d has been deleted',$id))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Carrier
",$this->filters['id']); printf ("
Name
",$this->filters['name']); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'name'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->carriers[0]){ return $result->carriers[0]; } else { return false; } } } function showRecord($carrier) { print "

Carrier

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $carrier->$item, $carrier->$item ); } else { printf ("
", $item, $carrier->$item ); } print " "; } printf ("",$carier->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print ""; } function updateRecord () { //print "

Updating carrier ..."; if (!$_REQUEST['id_filter']) return; if (!$carrier = $this->getRecord($_REQUEST['id_filter'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $carrier->$item = intval($_REQUEST[$var_name]); } else { $carrier->$item = trim($_REQUEST[$var_name]); } } $function=array('commit' => array('name' => 'updateCarrier', 'parameters' => array($carrier), 'logs' => array('success' => sprintf('Carrier %d has been updated',$_REQUEST['id_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } class Gateways extends Records { var $carriers=array(); var $FieldsReadOnly=array( 'reseller', 'changeDate' ); var $Fields=array( 'id' => array('type'=>'integer', 'readonly' => true), 'name' => array('type'=>'string'), 'carrier_id' => array('type'=>'integer'), 'transport' => array('type'=>'string'), 'ip' => array('name'=>'IP or hostname', 'type'=>'string'), 'port' => array('type'=>'integer') ); //var $transports=array('udp','tcp','tls'); var $transports=array('udp'); function Gateways($SoapEngine) { $this->filters = array( 'id' => trim($_REQUEST['id_filter']), 'name' => trim($_REQUEST['name_filter']), 'carrier_id' => trim($_REQUEST['carrier_id_filter']) ); $this->sortElements=array( 'changeDate' => 'Change date', 'name' => 'Gateway', 'carrier_id' => 'Carrier', 'ip' => 'Address' ); $this->Records($SoapEngine); } function listRecords() { $this->getCarriers(); $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($this->filters['id']), 'name' => $this->filters['name'], 'carrier_id'=> intval($this->filters['carrier_id']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "

$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->gateways[$i]) break; $gateway = $result->gateways[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $gateway->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway->id) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($gateway->reseller) ); $_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway->carrier_id), urlencode($gateway->reseller) ); $_rules_url = $this->url.sprintf("&service=gateway_rules@%s&gateway_id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway->id), urlencode($gateway->reseller) ); $_r=0; printf(" ", $index, $_customer_url, $gateway->reseller, $_url, $gateway->id, $_carrier_url, $gateway->carrier, $gateway->name, $gateway->transport, $gateway->ip, $gateway->port, $_rules_url, $gateway->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Gateway Carrier Name Address Rules Change date Actions
%s %s %s %s %s %s:%s:%s Rules %s %s
"; if ($this->rows == 1) { $this->showRecord($gateway); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; $this->getCarriers(); if (!count($this->carriers)) { print "

Create a carrier first"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; printf (" Carrier "); print ""); printf ("
Name
"); printf ("
Transport"); print "
"); printf ("
Address
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['name']) { $name = $dictionary['name']; } else { $name = trim($_REQUEST['name']); } if ($dictionary['carrier_id']) { $carrier_id = $dictionary['carrier_id']; } else { $carrier_id = trim($_REQUEST['carrier_id']); } if ($dictionary['address']) { $address = $dictionary['address']; } else { $address = trim($_REQUEST['address']); } if ($dictionary['transport']) { $transport = $dictionary['transport']; } else { $transport = trim($_REQUEST['transport']); } if (!strlen($name) || !strlen($carrier_id) || !strlen($address)) { printf ("

Error: Missing gateway name, carrier_id or address"); return false; } $address_els=explode(':',$address); if (count($address_els) == 1) { $ip = $address_els[0]; $port ='5060'; } else if (count($address_els) == 2) { $ip = $address_els[0]; $port = $address_els[1]; } if (!$port) $port = 5060; if (!in_array($transport,$this->transports)) { $transport=$this->transports[0]; } $gateway=array( 'name' => $name, 'carrier_id' => intval($carrier_id), 'ip' => $ip, 'port' => intval($port), 'transport' => $transport ); $function=array('commit' => array('name' => 'addGateway', 'parameters' => array($gateway), 'logs' => array('success' => sprintf('Gateway %s has been added',$name))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing gateway id. "; return false; } $function=array('commit' => array('name' => 'deleteGateway', 'parameters' => array(intval($id)), 'logs' => array('success' => sprintf('Gateway %d has been deleted',$id))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Gateway
",$this->filters['id']); print " "); printf ("
Name
",$this->filters['name']); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function showRecord($gateway) { print "

Gateway

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $gateway->$item, $gateway->$item ); } else { if ($item == 'carrier_id') { printf ("
"); } else if ($item == 'transport') { printf ("
"; } else { printf ("
", $item, $gateway->$item ); } } print "
"; } printf ("",$gateway->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print "
"; } function updateRecord () { //print "

Updating gateway ..."; if (!$_REQUEST['id_filter']) return; if (!$gateway = $this->getRecord($_REQUEST['id_filter'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $gateway->$item = intval($_REQUEST[$var_name]); } else { $gateway->$item = trim($_REQUEST[$var_name]); } } if (!in_array($gateway->transport,$this->transports)) { printf ("Invalid transport '%s'",$gateway->transport); return false; } $function=array('commit' => array('name' => 'updateGateway', 'parameters' => array($gateway), 'logs' => array('success' => sprintf('Gateway %s has been updated',$_REQUEST['name_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'name'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->gateways[0]){ return $result->gateways[0]; } else { return false; } } } } class GatewayRules extends Records { var $carriers=array(); var $FieldsReadOnly=array( 'reseller', 'changeDate' ); var $Fields=array( 'id' => array('type'=>'integer','readonly' => true), 'gateway_id' => array('type'=>'integer','name' => 'Gateway'), 'prefix' => array('type'=>'string'), 'strip' => array('type'=>'integer'), 'prepend' => array('type'=>'string'), 'minLength' => array('type'=>'integer'), 'maxLength' => array('type'=>'integer') ); function GatewayRules($SoapEngine) { $this->filters = array('id' => trim($_REQUEST['id_filter']), 'gateway_id' => trim($_REQUEST['gateway_id_filter']), 'carrier_id' => trim($_REQUEST['carrier_id_filter']), 'prefix' => trim($_REQUEST['prefix_filter']), ); $this->sortElements=array( 'changeDate' => 'Change date', 'gateway' => 'Gateway', 'carrier' => 'Carrier', 'prefix' => 'Prefix' ); $this->Records($SoapEngine); } function listRecords() { $this->getCarriers(); $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($this->filters['id']), 'gateway_id' => intval($this->filters['gateway_id']), 'carrier_id' => intval($this->filters['carrier_id']), 'prefix' => $this->filters['prefix'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->log_action('getGatewayRules'); $result = $this->SoapEngine->soapclient->getGatewayRules($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "

$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->gateway_rules[$i]) break; $gateway_rule = $result->gateway_rules[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway_rule->id), urlencode($gateway_rule->reseller) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $gateway_rule->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway_rule->id), urlencode($gateway_rule->reseller) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($gateway_rule->reseller) ); $_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway_rule->carrier_id), urlencode($gateway_rule->reseller) ); $_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway_rule->gateway_id), urlencode($gateway_rule->reseller) ); printf(" ", $index, $_customer_url, $gateway_rule->reseller, $_url, $gateway_rule->id, $_carrier_url, $gateway_rule->carrier,$gateway_rule->carrier_id, $_gateway_url, $gateway_rule->gateway,$gateway_rule->gateway_id, $gateway_rule->prefix, $gateway_rule->strip, $gateway_rule->prepend, $gateway_rule->minLength, $gateway_rule->maxLength, $gateway_rule->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Owner Rule Carrier Gateway Prefix Strip Prepend MinLength MaxLength Change date Actions
%s %s %s %s (%d) %s (%d) %s %s %s %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($gateway_rule); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; $this->getGateways(); if (!count($this->gateways)) { print "

Create a gateway first"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; print "
Gateway
"); printf ("
Prefix
"); printf ("
Strip
"); printf ("
Prepend
"); printf ("
Min length
"); printf ("
Max length
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['gateway_id']) { $gateway_id = $dictionary['gateway_id']; } else { $gateway_id = trim($_REQUEST['gateway_id']); } if ($dictionary['prefix']) { $prefix = $dictionary['prefix']; } else { $prefix = trim($_REQUEST['prefix']); } if ($dictionary['strip']) { $strip = $dictionary['strip']; } else { $strip = trim($_REQUEST['strip']); } if ($dictionary['prepend']) { $prepend = $dictionary['prepend']; } else { $prepend = trim($_REQUEST['prepend']); } if ($dictionary['minLength']) { $minLength = $dictionary['minLength']; } else { $minLength = trim($_REQUEST['minLength']); } if ($dictionary['maxLength']) { $maxLength = $dictionary['maxLength']; } else { $maxLength = trim($_REQUEST['maxLength']); } if (!strlen($gateway_id)) { printf ("

Error: Missing gateway id"); return false; } $rule=array( 'gateway_id' => intval($gateway_id), 'prefix' => $prefix, 'prepend' => $prepend, 'strip' => intval($strip), 'minLength' => intval($minLength), 'maxLength' => intval($maxLength) ); $function=array('commit' => array('name' => 'addGatewayRule', 'parameters' => array($rule), 'logs' => array('success' => sprintf('Gateway rule has been added'))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing rule id "; return false; } $function=array('commit' => array('name' => 'deleteGatewayRule', 'parameters' => array(intval($id)), 'logs' => array('success' => sprintf('Gateway rule %d has been deleted',$id))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Rule
",$this->filters['id']); print " "); printf ("
Gateway
",$this->filters['gateway_id']); printf ("
Prefix
",$this->filters['prefix']); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function showRecord($rule) { $this->getGateways(); print "

Rule

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $rule->$item, $rule->$item ); } else { if ($item == 'gateway_id') { printf ("
"; } else { printf ("
", $item, $rule->$item ); } } print "
"; } printf ("",$rule->reseller); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print "
"; } function updateRecord () { //print "

Updating rule ..."; if (!$_REQUEST['id_form'] || !strlen($_REQUEST['reseller_filter'])) { return; } if (!$rule = $this->getRecord($_REQUEST['id_form'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $rule->$item = intval($_REQUEST[$var_name]); } else { $rule->$item = trim($_REQUEST[$var_name]); } } $function=array('commit' => array('name' => 'updateGatewayRule', 'parameters' => array($rule), 'logs' => array('success' => sprintf('Rule %d has been updated',$_REQUEST['id_form']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order $this->sorting['sortBy'] = 'gateway'; $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getGatewayRules'); $result = $this->SoapEngine->soapclient->getGatewayRules($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->gateway_rules[0]){ return $result->gateway_rules[0]; } else { return false; } } } } class Routes extends Records { var $carriers=array(); var $Fields=array( 'id' => array('type'=>'integer', 'readonly' => true), 'carrier_id' => array('type'=>'integer','name'=>'Carrier'), 'prefix' => array('type'=>'string'), 'originator' => array('type'=>'string'), 'priority' => array('type'=>'integer') ); var $sortElements=array( 'prefix' => 'Prefix', 'priority' => 'Priority' ); function Routes($SoapEngine) { $this->filters = array('prefix' => trim($_REQUEST['prefix_filter']), 'priority' => trim($_REQUEST['priority_filter']), 'carrier_id'=> trim($_REQUEST['carrier_id_filter']), 'reseller' => trim($_REQUEST['reseller_filter']), 'id' => trim($_REQUEST['id_filter']) ); $this->Records($SoapEngine); } function listRecords() { $this->getCarriers(); $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('prefix' => $this->filters['prefix'], 'carrier_id' => intval($this->filters['carrier_id']), 'reseller' => intval($this->filters['reseller']), 'id' => intval($this->filters['id']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'prefix'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getRoutes'); $result = $this->SoapEngine->soapclient->getRoutes($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "

$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->routes[$i]) break; $route = $result->routes[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%d", urlencode($this->SoapEngine->service), urlencode($route->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $route->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%d", urlencode($this->SoapEngine->service), urlencode($route->id) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($route->reseller) ); $_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($route->carrier_id) ); $_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($route->carrier_id), urlencode($route->reseller) ); printf(" ", $index, $_customer_url, $route->reseller, $_url, $route->id, $_carrier_url, $route->carrier, $_gateway_url, $route->prefix, $route->originator, $route->priority, $route->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Route Carrier Gateways Prefix Originator Priority Change date Actions
%s %s %s %s Gateways %s %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($route); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; if (!count($this->carriers)) { print "

Create a carrier first"; return false; } printf ("

",$_SERVER['PHP_SELF']); print " "; print "
"; printf (" Carrier "); print ""; print "
"); printf ("
Prefix
"); printf ("
Originator
"); printf ("
Priority
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['prefix']) { $prefix = $dictionary['prefix']; } else { $prefix = trim($_REQUEST['prefix']); } if ($dictionary['carrier_id']) { $carrier_id = $dictionary['carrier_id']; } else { $carrier_id = trim($_REQUEST['carrier_id']); } if ($dictionary['originator']) { $originator = $dictionary['originator']; } else { $originator = trim($_REQUEST['originator']); } if ($dictionary['priority']) { $priority = $dictionary['priority']; } else { $priority = trim($_REQUEST['priority']); } if (!strlen($carrier_id)) { printf ("

Error: Missing carrier id. "); return false; } $route=array( 'prefix' => $prefix, 'originator' => $originator, 'carrier_id' => intval($carrier_id), 'priority' => intval($priority) ); $routes=array($route); $function=array('commit' => array('name' => 'addRoutes', 'parameters' => array($routes), 'logs' => array('success' => sprintf('Route %s has been added',$prefix))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing route id. "; return false; } $route=array('id'=> intval($id)); $routes=array($route); $function=array('commit' => array('name' => 'deleteRoutes', 'parameters' => array($routes), 'logs' => array('success' => sprintf('Route %s has been deleted',$prefix))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Route
",$this->filters['id']); print " "; printf ("
Prefix
",$this->filters['prefix']); } function showCustomerTextBox () { print "Owner"; $this->showResellerForm('reseller'); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'prefix'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getRoutes'); $result = $this->SoapEngine->soapclient->getRoutes($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->routes[0]){ return $result->routes[0]; } else { return false; } } } function showRecord($route) { print "

Route

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $route->$item, $route->$item ); } else { if ($item == 'carrier_id') { printf ("
"); } else { printf ("
", $item, $route->$item ); } } print "
"; } printf ("",$carier->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print "
"; } function updateRecord () { //print "

Updating route ..."; if (!$_REQUEST['id_filter']) return; if (!$route = $this->getRecord($_REQUEST['id_filter'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $route->$item = intval($_REQUEST[$var_name]); } else { $route->$item = trim($_REQUEST[$var_name]); } } $routes=array($route); $function=array('commit' => array('name' => 'updateRoutes', 'parameters' => array($routes), 'logs' => array('success' => sprintf('Route %d has been updated',$_REQUEST['id_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } class Customers extends Records { var $children = array(); var $showAddForm = false; var $sortElements = array( 'changeDate' => 'Change date', 'username' => 'Username', 'firstName' => 'First name', 'lastName' => 'Last name', 'organization' => 'Organization', 'customer' => 'Customer' ); var $propertiesItems = array('sip_credit' => array('name' => 'Credit for SIP accounts', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'sip_alias_credit' => array('name' => 'Credit for SIP aliases', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'enum_range_credit' => array('name' => 'Credit for ENUM ranges', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'enum_number_credit' => array('name' => 'Credit for ENUM numbers', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'dns_zone_credit' => array('name' => 'Credit for DNS zones', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'email_credit' => array('name' => 'Credit for E-mail aliases', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'pstn_access' => array('name' => 'Access to PSTN', 'category' => 'sip', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'prepaid_changes' => array('name' => 'Prepaid Changes', 'category' => 'sip', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'pstn_changes' => array('name' => 'Pstn Changes', 'category' => 'sip', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'payment_processor_class' => array('name' => 'Payment Processor Class', 'category' => 'sip', 'permission' => 'admin' ), 'voicemail_server' => array('name' => 'Voicemail Server Address', 'category' => 'sip', 'permission' => 'customer' ), 'voicemail_access_number' => array('name' => 'Voicemail Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FUNC_access_number' => array('name' => 'Forwarding Unconditional Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FNOL_access_number' => array('name' => 'Forwarding Not-Online Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FNOA_access_number' => array('name' => 'Forwarding Not-Available Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FBUS_access_number' => array('name' => 'Forwarding On Busy Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'change_privacy_access_number' => array('name' => 'Change privacy Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'check_privacy_access_number' => array('name' => 'Check privacy Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'reject_anonymous_access_number' => array('name' => 'Reject anonymous Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'sip_proxy' => array('name' => 'SIP Proxy Address', 'category' => 'sip', 'permission' => 'customer' ), 'sip_outbound_proxy' => array('name' => 'SIP Client Outbound proxy', 'category' => 'sip', 'permission' => 'customer' ), 'store_clear_text_passwords' => array('name' => 'Store clear text passwords', 'category' => 'sip', 'permission' => 'customer' ), 'xcap_root' => array('name' => 'XCAP Root URL', 'category' => 'sip', 'permission' => 'customer' ), 'absolute_voicemail_uri'=> array('name' => 'Use Absolute Voicemail Uri', 'category' => 'sip', 'permission' => 'customer' ), 'dns_admin_email' => array('name' => 'DNS zones Administrator Email', 'category' => 'dns', 'permission' => 'customer'), 'support_web' => array('name' => 'Support Web Site', 'category' => 'sip', 'permission' => 'customer' ), 'support_email' => array('name' => 'Support Email Address', 'category' => 'sip', 'permission' => 'customer' ), 'billing_email' => array('name' => 'Billing Email Address', 'category' => 'sip', 'permission' => 'customer' ), 'support_company' => array('name' => 'Support Organization', 'category' => 'sip', 'permission' => 'customer' ), 'cdrtool_address' => array('name' => 'CDRTool Address', 'category' => 'sip', 'permission' => 'customer' ), 'sip_settings_page' => array('name' => 'SIP Settings Page', 'category' => 'sip', 'permission' => 'customer' ), 'digest_settings_page' => array('name' => 'Settings Page (Digest Auth)', 'category' => 'sip', 'permission' => 'reseller' ), 'records_per_page' => array('name' => 'Records per page', 'category' => 'web', 'permission' => 'customer' ), 'push_notifications_server' => array('name'=>'Push server public interface', 'category' =>'sip', 'permission' => 'customer' ), 'push_notifications_server_private' => array('name'=>'Push server private interface', 'category' =>'sip', 'permission' => 'customer' ) ); var $FieldsReadOnly=array( 'id' => array('type'=>'integer'), 'reseller' => array('type'=>'integer') ); var $Fields=array( 'resellerActive' => array ('type' => 'boolean', 'name' => 'Reseller active', 'adminonly' => true ), 'impersonate' => array('type' =>'integer', 'name' =>'Impersonate'), 'companyCode' => array('type' =>'text', 'name' =>'Company code', 'adminonly' => true ), 'balance' => array('type' => 'float', 'adminonly' => true ), 'credit' => array('type' => 'float', 'adminonly' => true ), 'username' => array('type' =>'text', 'extra_html' => 'readonly autocomplete="off"' ), 'password' => array('type'=>'text', 'name'=>'Password'), 'firstName' => array('type'=>'text', 'name'=>'First name'), 'lastName' => array('type'=>'text', 'name'=>'Last name'), 'organization'=> array('type'=>'text'), 'tel' => array('type'=>'text'), 'fax' => array('type'=>'text'), 'sip' => array('type'=>'text'), 'enum' => array('type'=>'text'), 'mobile' => array('type'=>'text'), 'email' => array('type'=>'text'), 'web' => array('type'=>'text'), 'address' => array('type'=>'textarea'), 'postcode' => array('type'=>'text'), 'city' => array('type'=>'text'), 'state' => array('type'=>'text'), 'country' => array('type'=>'text'), 'timezone' => array('type'=>'text'), 'language' => array('type'=>'text'), 'vatNumber' => array('type'=>'text', 'name'=>'VAT number'), 'bankAccount' => array('type'=>'text', 'name'=>'Bank account' ), 'billingEmail' => array('type'=>'text', 'name'=>'Billing email' ), 'billingAddress' => array('type'=>'textarea', 'name'=>'Billing address' ), ); var $addFields=array( 'username' => array('type' =>'text' ), 'password' => array('type'=>'text', 'name'=>'Password'), 'firstName' => array('type'=>'text', 'name'=>'First name'), 'lastName' => array('type'=>'text', 'name'=>'Last name'), 'organization'=> array('type'=>'text'), 'tel' => array('type'=>'text'), 'email' => array('type'=>'text'), 'address' => array('type'=>'textarea'), 'postcode' => array('type'=>'text'), 'city' => array('type'=>'text'), 'state' => array('type'=>'text'), 'country' => array('type'=>'text'), 'timezone' => array('type'=>'text') ); var $states=array( array("label"=>"", "value"=>"N/A"), array("label"=>"-- CANADA --", "value"=>"-"), array("label"=>"Alberta", "value"=>"AB"), array("label"=>"British Columbia", "value"=>"BC"), array("label"=>"Manitoba", "value"=>"MB"), array("label"=>"New Brunswick", "value"=>"NB"), array("label"=>"Newfoundland/Labrador", "value"=>"NL"), array("label"=>"Northwest Territory", "value"=>"NT"), array("label"=>"Nova Scotia", "value"=>"NS"), array("label"=>"Nunavut", "value"=>"NU"), array("label"=>"Ontario", "value"=>"ON"), array("label"=>"Prince Edward Island", "value"=>"PE"), array("label"=>"Quebec", "value"=>"QC"), array("label"=>"Saskatchewan", "value"=>"SN"), array("label"=>"Yukon", "value"=>"YT"), array("label"=>"---- US -----", "value"=>"-"), array("label"=>"Alabama", "value"=>"AL"), array("label"=>"Alaska", "value"=>"AK"), array("label"=>"American Samoa", "value"=>"AS"), array("label"=>"Arizona", "value"=>"AZ"), array("label"=>"Arkansas", "value"=>"AR"), array("label"=>"California", "value"=>"CA"), array("label"=>"Canal Zone", "value"=>"CZ"), array("label"=>"Colorado", "value"=>"CO"), array("label"=>"Connecticut", "value"=>"CT"), array("label"=>"Delaware", "value"=>"DE"), array("label"=>"District of Columbia", "value"=>"DC"), array("label"=>"Florida", "value"=>"FL"), array("label"=>"Georgia", "value"=>"GA"), array("label"=>"Guam", "value"=>"GU"), array("label"=>"Hawaii", "value"=>"HI"), array("label"=>"Idaho", "value"=>"ID"), array("label"=>"Illinois", "value"=>"IL"), array("label"=>"Indiana", "value"=>"IN"), array("label"=>"Iowa", "value"=>"IA"), array("label"=>"Kansas", "value"=>"KS"), array("label"=>"Kentucky", "value"=>"KY"), array("label"=>"Louisiana", "value"=>"LA"), array("label"=>"Maine", "value"=>"ME"), array("label"=>"Mariana Islands", "value"=>"MP"), array("label"=>"Maryland", "value"=>"MD"), array("label"=>"Massachusetts", "value"=>"MA"), array("label"=>"Michigan", "value"=>"MI"), array("label"=>"Minnesota", "value"=>"MN"), array("label"=>"Mississippi", "value"=>"MS"), array("label"=>"Missouri", "value"=>"MO"), array("label"=>"Montana", "value"=>"MT"), array("label"=>"Nebraska", "value"=>"NE"), array("label"=>"Nevada", "value"=>"NV"), array("label"=>"New Hampshire", "value"=>"NH"), array("label"=>"New Jersey", "value"=>"NJ"), array("label"=>"New Mexico", "value"=>"NM"), array("label"=>"New York", "value"=>"NY"), array("label"=>"North Carolina", "value"=>"NC"), array("label"=>"North Dakota", "value"=>"ND"), array("label"=>"Ohio", "value"=>"OH"), array("label"=>"Oklahoma", "value"=>"OK"), array("label"=>"Oregon", "value"=>"OR"), array("label"=>"Pennsylvania", "value"=>"PA"), array("label"=>"Puerto Rico", "value"=>"PR"), array("label"=>"Rhode Island", "value"=>"RI"), array("label"=>"South Carolina", "value"=>"SC"), array("label"=>"South Dakota", "value"=>"SD"), array("label"=>"Tennessee", "value"=>"TN"), array("label"=>"Texas", "value"=>"TX"), array("label"=>"Utah", "value"=>"UT"), array("label"=>"Vermont", "value"=>"VT"), array("label"=>"Virgin Islands", "value"=>"VI"), array("label"=>"Virginia", "value"=>"VA"), array("label"=>"Washington", "value"=>"WA"), array("label"=>"West Virginia", "value"=>"WV"), array("label"=>"Wisconsin", "value"=>"WI"), array("label"=>"Wyoming", "value"=>"WY"), array("label"=>"APO", "value"=>"AP"), array("label"=>"AEO", "value"=>"AE"), array("label"=>"AAO", "value"=>"AA"), array("label"=>"FPO", "value"=>"FP") ); var $countries=array( array("label"=>"Ascension Island", "value"=>"AC"), array("label"=>"Afghanistan", "value"=>"AF"), array("label"=>"Albania", "value"=>"AL"), array("label"=>"Algeria", "value"=>"DZ"), array("label"=>"American Samoa", "value"=>"AS"), array("label"=>"Andorra", "value"=>"AD"), array("label"=>"Angola", "value"=>"AO"), array("label"=>"Anguilla", "value"=>"AI"), array("label"=>"Antarctica", "value"=>"AQ"), array("label"=>"Antigua And Barbuda", "value"=>"AG"), array("label"=>"Argentina", "value"=>"AR"), array("label"=>"Armenia", "value"=>"AM"), array("label"=>"Aruba", "value"=>"AW"), array("label"=>"Australia", "value"=>"AU"), array("label"=>"Austria", "value"=>"AT"), array("label"=>"Azerbaijan", "value"=>"AZ"), array("label"=>"Bahamas", "value"=>"BS"), array("label"=>"Bahrain", "value"=>"BH"), array("label"=>"Bangladesh", "value"=>"BD"), array("label"=>"Barbados", "value"=>"BB"), array("label"=>"Belarus", "value"=>"BY"), array("label"=>"Belgium", "value"=>"BE"), array("label"=>"Belize", "value"=>"BZ"), array("label"=>"Benin", "value"=>"BJ"), array("label"=>"Bermuda", "value"=>"BM"), array("label"=>"Bhutan", "value"=>"BT"), array("label"=>"Bolivia", "value"=>"BO"), array("label"=>"Bosnia And Herzegowina","value"=>"BA"), array("label"=>"Botswana", "value"=>"BW"), array("label"=>"Bouvet Island", "value"=>"BV"), array("label"=>"Brazil", "value"=>"BR"), array("label"=>"British Indian Ocean Territory", "value"=>"IO"), array("label"=>"Brunei Darussalam", "value"=>"BN"), array("label"=>"Bulgaria", "value"=>"BG"), array("label"=>"Burkina Faso", "value"=>"BF"), array("label"=>"Burundi", "value"=>"BI"), array("label"=>"Cambodia", "value"=>"KH"), array("label"=>"Cameroon", "value"=>"CM"), array("label"=>"Canada", "value"=>"CA"), array("label"=>"Cape Verde", "value"=>"CV"), array("label"=>"Cayman Islands", "value"=>"KY"), array("label"=>"Central African Republic", "value"=>"CF"), array("label"=>"Chad", "value"=>"TD"), array("label"=>"Chile", "value"=>"CL"), array("label"=>"China", "value"=>"CN"), array("label"=>"Christmas Island", "value"=>"CX"), array("label"=>"Cocos (Keeling) Islands", "value"=>"CC"), array("label"=>"Colombia", "value"=>"CO"), array("label"=>"Comoros", "value"=>"KM"), array("label"=>"Congo", "value"=>"CG"), array("label"=>"Congo, Democratic People's Republic", "value"=>"CD"), array("label"=>"Cook Islands", "value"=>"CK"), array("label"=>"Costa Rica", "value"=>"CR"), array("label"=>"Cote d'Ivoire", "value"=>"CI"), array("label"=>"Croatia (local name: Hrvatska)", "value"=>"HR"), array("label"=>"Cuba", "value"=>"CU"), array("label"=>"Cyprus", "value"=>"CY"), array("label"=>"Czech Republic","value"=>"CZ"), array("label"=>"Denmark", "value"=>"DK"), array("label"=>"Djibouti", "value"=>"DJ"), array("label"=>"Dominica", "value"=>"DM"), array("label"=>"Dominican Republic", "value"=>"DO"), array("label"=>"East Timor", "value"=>"TP"), array("label"=>"Ecuador", "value"=>"EC"), array("label"=>"Egypt", "value"=>"EG"), array("label"=>"El Salvador", "value"=>"SV"), array("label"=>"Equatorial Guinea", "value"=>"GQ"), array("label"=>"Eritrea", "value"=>"ER"), array("label"=>"Estonia", "value"=>"EE"), array("label"=>"Ethiopia", "value"=>"ET"), array("label"=>"Falkland Islands (Malvinas)", "value"=>"FK"), array("label"=>"Faroe Islands", "value"=>"FO"), array("label"=>"Fiji", "value"=>"FJ"), array("label"=>"Finland", "value"=>"FI"), array("label"=>"France", "value"=>"FR"), array("label"=>"French Guiana", "value"=>"GF"), array("label"=>"French Polynesia", "value"=>"PF"), array("label"=>"French Southern Territories", "value"=>"TF"), array("label"=>"Gabon", "value"=>"GA"), array("label"=>"Gambia", "value"=>"GM"), array("label"=>"Georgia", "value"=>"GE"), array("label"=>"Germany", "value"=>"DE"), array("label"=>"Ghana", "value"=>"GH"), array("label"=>"Gibraltar", "value"=>"GI"), array("label"=>"Greece", "value"=>"GR"), array("label"=>"Greenland", "value"=>"GL"), array("label"=>"Grenada", "value"=>"GD"), array("label"=>"Guadeloupe", "value"=>"GP"), array("label"=>"Guam", "value"=>"GU"), array("label"=>"Guatemala", "value"=>"GT"), array("label"=>"Guernsey", "value"=>"GG"), array("label"=>"Guinea", "value"=>"GN"), array("label"=>"Guinea-Bissau", "value"=>"GW"), array("label"=>"Guyana", "value"=>"GY"), array("label"=>"Haiti", "value"=>"HT"), array("label"=>"Heard And Mc Donald Islands", "value"=>"HM"), array("label"=>"Honduras", "value"=>"HN"), array("label"=>"Hong Kong", "value"=>"HK"), array("label"=>"Hungary", "value"=>"HU"), array("label"=>"Iceland", "value"=>"IS"), array("label"=>"India", "value"=>"IN"), array("label"=>"Indonesia", "value"=>"ID"), array("label"=>"Iran (Islamic Republic Of)", "value"=>"IR"), array("label"=>"Iraq", "value"=>"IQ"), array("label"=>"Ireland", "value"=>"IE"), array("label"=>"Isle of Man", "value"=>"IM"), array("label"=>"Israel", "value"=>"IL"), array("label"=>"Italy", "value"=>"IT"), array("label"=>"Jamaica", "value"=>"JM"), array("label"=>"Japan", "value"=>"JP"), array("label"=>"Jersey", "value"=>"JE"), array("label"=>"Jordan", "value"=>"JO"), array("label"=>"Kazakhstan", "value"=>"KZ"), array("label"=>"Kenya", "value"=>"KE"), array("label"=>"Kiribati", "value"=>"KI"), array("label"=>"Korea, Democratic People's Republic Of", "value"=>"KP"), array("label"=>"Korea, Republic Of", "value"=>"KR"), array("label"=>"Kuwait", "value"=>"KW"), array("label"=>"Kyrgyzstan", "value"=>"KG"), array("label"=>"Lao People's Democratic Republic", "value"=>"LA"), array("label"=>"Latvia", "value"=>"LV"), array("label"=>"Lebanon", "value"=>"LB"), array("label"=>"Lesotho", "value"=>"LS"), array("label"=>"Liberia", "value"=>"LR"), array("label"=>"Libyan Arab Jamahiriya", "value"=>"LY"), array("label"=>"Liechtenstein", "value"=>"LI"), array("label"=>"Lithuania", "value"=>"LT"), array("label"=>"Luxembourg", "value"=>"LU"), array("label"=>"Macau", "value"=>"MO"), array("label"=>"Macedonia, The Former Yugoslav", "value"=>"MK"), array("label"=>"Of", "value"=>"Republic"), array("label"=>"Madagascar", "value"=>"MG"), array("label"=>"Malawi", "value"=>"MW"), array("label"=>"Malaysia", "value"=>"MY"), array("label"=>"Maldives", "value"=>"MV"), array("label"=>"Mali", "value"=>"ML"), array("label"=>"Malta", "value"=>"MT"), array("label"=>"Marshall Islands", "value"=>"MH"), array("label"=>"Martinique", "value"=>"MQ"), array("label"=>"Mauritania", "value"=>"MR"), array("label"=>"Mauritius", "value"=>"MU"), array("label"=>"Mayotte", "value"=>"YT"), array("label"=>"Mexico", "value"=>"MX"), array("label"=>"Micronesia, Federated States Of", "value"=>"FM"), array("label"=>"Moldova, Republic Of", "value"=>"MD"), array("label"=>"Monaco", "value"=>"MC"), array("label"=>"Mongolia", "value"=>"MN"), array("label"=>"Montserrat", "value"=>"MS"), array("label"=>"Morocco", "value"=>"MA"), array("label"=>"Mozambique", "value"=>"MZ"), array("label"=>"Myanmar", "value"=>"MM"), array("label"=>"Namibia", "value"=>"NA"), array("label"=>"Nauru", "value"=>"NR"), array("label"=>"Nepal", "value"=>"NP"), array("label"=>"Netherlands", "value"=>"NL"), array("label"=>"Netherlands Antilles", "value"=>"AN"), array("label"=>"New Caledonia", "value"=>"NC"), array("label"=>"New Zealand", "value"=>"NZ"), array("label"=>"Nicaragua", "value"=>"NI"), array("label"=>"Niger", "value"=>"NE"), array("label"=>"Nigeria", "value"=>"NG"), array("label"=>"Niue", "value"=>"NU"), array("label"=>"Norfolk Island", "value"=>"NF"), array("label"=>"Northern Mariana Islands", "value"=>"MP"), array("label"=>"Norway", "value"=>"NO"), array("label"=>"Oman", "value"=>"OM"), array("label"=>"Pakistan", "value"=>"PK"), array("label"=>"Palau", "value"=>"PW"), array("label"=>"Palestinian Territories", "value"=>"PS"), array("label"=>"Panama", "value"=>"PA"), array("label"=>"Papua New Guinea", "value"=>"PG"), array("label"=>"Paraguay", "value"=>"PY"), array("label"=>"Peru", "value"=>"PE"), array("label"=>"Philippines", "value"=>"PH"), array("label"=>"Pitcairn", "value"=>"PN"), array("label"=>"Poland", "value"=>"PL"), array("label"=>"Portugal", "value"=>"PT"), array("label"=>"Puerto Rico", "value"=>"PR"), array("label"=>"Qatar", "value"=>"QA"), array("label"=>"Reunion", "value"=>"RE"), array("label"=>"Romania", "value"=>"RO"), array("label"=>"Russian Federation", "value"=>"RU"), array("label"=>"Rwanda", "value"=>"RW"), array("label"=>"Saint Kitts And Nevis", "value"=>"KN"), array("label"=>"Saint Lucia", "value"=>"LC"), array("label"=>"Saint Vincent And The Grenadines", "value"=>"VC"), array("label"=>"Samoa", "value"=>"WS"), array("label"=>"San Marino", "value"=>"SM"), array("label"=>"Sao Tome And Principe", "value"=>"ST"), array("label"=>"Saudi Arabia", "value"=>"SA"), array("label"=>"Senegal", "value"=>"SN"), array("label"=>"Seychelles", "value"=>"SC"), array("label"=>"Sierra Leone", "value"=>"SL"), array("label"=>"Singapore", "value"=>"SG"), array("label"=>"Slovakia (Slovak Republic)", "value"=>"SK"), array("label"=>"Slovenia", "value"=>"SI"), array("label"=>"Solomon Islands", "value"=>"SB"), array("label"=>"Somalia", "value"=>"SO"), array("label"=>"South Africa", "value"=>"ZA"), array("label"=>"South Georgia And South Sandwich", "value"=>"GS"), array("label"=>"Spain", "value"=>"ES"), array("label"=>"Sri Lanka", "value"=>"LK"), array("label"=>"St. Helena", "value"=>"SH"), array("label"=>"St. Pierre And Miquelon", "value"=>"PM"), array("label"=>"Sudan", "value"=>"SD"), array("label"=>"Suriname", "value"=>"SR"), array("label"=>"Svalbard And Jan Mayen Islands", "value"=>"SJ"), array("label"=>"Swaziland", "value"=>"SZ"), array("label"=>"Sweden", "value"=>"SE"), array("label"=>"Switzerland", "value"=>"CH"), array("label"=>"Syrian Arab Republic", "value"=>"SY"), array("label"=>"Taiwan, Province Of China", "value"=>"TW"), array("label"=>"Tajikistan", "value"=>"TJ"), array("label"=>"Tanzania, United Republic Of", "value"=>"TZ"), array("label"=>"Thailand", "value"=>"TH"), array("label"=>"Togo", "value"=>"TG"), array("label"=>"Tokelau", "value"=>"TK"), array("label"=>"Tonga", "value"=>"TO"), array("label"=>"Trinidad And Tobago", "value"=>"TT"), array("label"=>"Tunisia", "value"=>"TN"), array("label"=>"Turkey", "value"=>"TR"), array("label"=>"Turkmenistan", "value"=>"TM"), array("label"=>"Turks And Caicos Islands", "value"=>"TC"), array("label"=>"Tuvalu", "value"=>"TV"), array("label"=>"Uganda", "value"=>"UG"), array("label"=>"Ukraine", "value"=>"UA"), array("label"=>"United Arab Emirates", "value"=>"AE"), array("label"=>"United Kingdom", "value"=>"UK"), array("label"=>"United States", "value"=>"US"), array("label"=>"United States Minor Outlying Islands", "value"=>"UM"), array("label"=>"Uruguay", "value"=>"UY"), array("label"=>"Uzbekistan", "value"=>"UZ"), array("label"=>"Vanuatu", "value"=>"VU"), array("label"=>"Vatican City State (Holy See)", "value"=>"VA"), array("label"=>"Venezuela", "value"=>"VE"), array("label"=>"Viet Nam", "value"=>"VN"), array("label"=>"Virgin Islands (British)", "value"=>"VG"), array("label"=>"Virgin Islands (U.S.)", "value"=>"VI"), array("label"=>"Wallis And Futuna Islands", "value"=>"WF"), array("label"=>"Western Sahara", "value"=>"EH"), array("label"=>"Yemen", "value"=>"YE"), array("label"=>"Yugoslavia", "value"=>"YU"), array("label"=>"Zaire", "value"=>"ZR"), array("label"=>"Zambia", "value"=>"ZM"), array("label"=>"Zimbabwe", "value"=>"ZW"), array("label"=>"Undefined", "value"=>"N/A") ); var $hide_html = false; function Customers($SoapEngine) { dprint("init Customers"); $this->filters = array( 'username' => trim($_REQUEST['username_filter']), 'firstName' => trim($_REQUEST['firstName_filter']), 'lastName' => trim($_REQUEST['lastName_filter']), 'organization' => trim($_REQUEST['organization_filter']), 'tel' => trim($_REQUEST['tel_filter']), 'email' => trim($_REQUEST['email_filter']), 'web' => trim($_REQUEST['web_filter']), 'country' => trim($_REQUEST['country_filter']), 'city' => trim($_REQUEST['city_filter']), 'only_resellers' => trim($_REQUEST['only_resellers_filter']) ); $this->Records($SoapEngine); $this->showAddForm = $_REQUEST['showAddForm']; if (is_array($this->SoapEngine->customer_properties)) { $this->customer_properties = $this->SoapEngine->customer_properties; } else { $this->customer_properties = array(); } $this->allProperties=array_merge($this->propertiesItems,$this->customer_properties); } function showSeachForm() { printf ("

%s", $this->SoapEngine->ports[$this->SoapEngine->port]['description'], '%' ); printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; print " "; $this->showEngineSelection(); print "
"; $this->showSortForm(); print "

Id"; $this->showCustomerSelection(); $this->showResellerSelection(); print "
"; $this->showSeachFormCustom(); $this->printHiddenFormElements('skipServiceElement'); print "
"; } function listRecords() { // Filter $filter=array('username' => $this->filters['username'], 'firstName' => $this->filters['firstName'], 'lastName' => $this->filters['lastName'], 'organization' => $this->filters['organization'], 'tel' => $this->filters['tel'], 'email' => $this->filters['email'], 'web' => $this->filters['web'], 'city' => $this->filters['city'], 'country' => $this->filters['country'], 'only_resellers' => $this->filters['only_resellers'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); //print_r($filter); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->showSeachForm(); if ($this->showAddForm) { $this->showAddForm(); return true; } // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function if ($this->adminonly && $this->filters['only_resellers']) { $this->log_action('getResellers'); $result = $this->SoapEngine->soapclient->getResellers($Query); } else { $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); } if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "
$this->rows records found. Click on the id to edit the account.
"; print "
"; $_add_url = $this->url.sprintf("&service=%s&showAddForm=1", urlencode($this->SoapEngine->service) ); printf ("Add new account ",$_add_url); if ($this->adminonly) { if ($this->adminonly && $this->filters['reseller']) { $_add_url = $this->url.sprintf("&service=%s&showAddForm=1&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($this->filters['reseller']) ); printf (" Add a new account for reseller %s",$_add_url,$this->filters['reseller']); } } print "
"; if ($this->rows > 1) { print " "; } if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows > 1) { while ($i < $maxrows) { if (!$result->accounts[$i]) break; $customer = $result->accounts[$i]; $index = $this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&reseller_filter=%s&customer_filter=%s", urlencode($this->SoapEngine->service), urlencode($customer->reseller), urlencode($customer->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['customer_filter'] == $customer->id) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_customer_url = $this->url.sprintf("&service=%s&reseller_filter=%s&customer_filter=%s", urlencode($this->SoapEngine->service), urlencode($customer->reseller), urlencode($customer->id) ); printf(" "; $i++; } } print "
Id Impersonate Username Name Organization Country E-mail Phone number Change date Actions
%s %s.%s %s %s %s %s %s %s %s %s %s %s ", $index, $_customer_url, $customer->id, $customer->reseller, $customer->impersonate, strip_tags($customer->username), strip_tags($customer->firstName), strip_tags($customer->lastName), strip_tags($customer->organization), strip_tags($customer->country), strip_tags($customer->email), strip_tags($customer->email), $customer->tel, $customer->changeDate, $_url, $actionText ); $this->showExtraActions($customer); print "
"; if ($this->rows == 1 ) { $customer = $result->accounts[0]; $this->showRecord($customer); } $this->showPagination($maxrows); return true; } } function showSeachFormCustom() { printf ("
Username
",$this->filters['username']); printf ("
FN
\n",$this->filters['firstName']); printf ("
LN
\n",$this->filters['lastName']); printf ("
Organization
\n",$this->filters['organization']); printf ("
Email
\n",$this->filters['email']); if ($this->adminonly) { if ($this->filters['only_resellers']) $check_only_resellers_filter='checked'; printf (" Resellers ",$check_only_resellers_filter); } } function deleteRecord($dictionary= Array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['customer']) { $customer=$dictionary['customer']; } else { $customer=$this->filters['customer']; } if (!strlen($customer)) { print "

Error: missing customer id. "; return false; } $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array(intval($customer)), 'logs' => array('success' => sprintf('Customer id %s has been deleted',$this->filters['customer']))) ); if ($this->SoapEngine->execute($function,$this->html)) { unset($this->filters); return true; } else { return false; } } function getRecord($id) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount(intval($id)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return $result; } } function showRecordHeader($customer) { } function showRecordFooter($customer) { } function showExtraActions($customer) { } function showRecord($customer) { //dprint_r($customer); $this->showRecordHeader($customer); print ""; printf ("",$_SERVER['PHP_SELF']); print " "; print "
"; if ($_REQUEST['action'] != 'Delete' && $_REQUEST['action'] != 'Copy') { print ""; printf (" E-mail account information"); } print " "; printf ("",$customer->id); if ($this->adminonly) { printf ("",$customer->reseller); } if ($this->adminonly || $this->reseller == $customer->reseller) { if ($_REQUEST['action'] != 'Delete') { print "
"; } print "
"; if ($_REQUEST['action'] == 'Delete' || $_REQUEST['action'] == 'Copy') { print ""; } } print "
"; printf (""); foreach (array_keys($this->FieldsReadOnly) as $item) { printf ("", ucfirst($item), $customer->$item ); } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($item=='timezone') { printf ("", $item_name ); print " "; } else if ($item=='state') { printf ("", $item_name ); print " "; } else if ($item=='country') { printf ("", $item_name ); print " "; } else if ($item=='resellerActive' && ($customer->reseller != $customer->id)) { printf ("", $item, $customer->$item); } else if ($item=='impersonate') { if ($customer->reseller != $customer->id) { if ($this->adminonly || $this->customer == $customer->reseller) { printf ("", $item_name ); print " "; } else { printf (" ", $item_name, $item, $customer->$item, $customer->$item ); } } else { printf (" ", $item, $customer->$item ); } } else { if ($this->Fields[$item]['type'] == 'textarea') { printf (" ", $item_name, $item, $customer->$item ); } elseif ($this->Fields[$item]['type'] == 'boolean') { if ($this->Fields[$item]['adminonly'] && !$this->adminonly) { printf (" ", $item_name, $item, $customer->$item, $customer->$item ); } else { $_var='select_'.$item; ${$_var}[$customer->$item]='selected'; printf (" ", $item_name, $item, ${$_var}[0], ${$_var}[1] ); } } else { if ($this->Fields[$item]['adminonly'] && !$this->adminonly) { printf (" ", $item_name, $item, $customer->$item, $customer->$item ); } else { printf (" ", $item_name, $item, $customer->$item, $this->Fields[$item]['extra_html'] ); } } } } $this->printFiltersToForm(); $this->printHiddenFormElements(); //print ""; print "
Property Value
%s %s
%s"; $this->showTimezones($customer->$item); print "
%s
%s
%s "; $this->getChildren($customer->reseller); if (count($this->children)> 0) { print " "; } else { printf (" ", $item, $customer->$item ); } print "
%s %s
%s
%s %s
%s
%s %s
%s
"; /* print "
";
         print_r($customer);
         print "
"; */ print "
"; /* print "
";
         print_r($this->login_credentials);
         print "
"; */ print " "; if ($this->login_credentials['login_type'] == 'admin') { printf (""); } else if ($this->login_credentials['login_type'] == 'reseller') { printf ("" ); } else { printf ("" ); } foreach ($customer->properties as $_property) { if (in_array($_property->name,array_keys($this->allProperties))) { $this->allProperties[$_property->name]['value']=$_property->value; } } foreach (array_keys($this->allProperties) as $item) { $item_print=preg_replace("/_/"," ",$item); $_permission=$this->allProperties[$item]['permission']; if ($this->login_credentials['login_type'] == 'admin') { if ($this->allProperties[$item]['permission'] == 'admin' && $customer->id != $customer->reseller && $this->allProperties[$item]['resellerMayManageForChildAccounts']) { $_permission='reseller'; } printf ("", $this->allProperties[$item]['category'], ucfirst($_permission), $item_print, $item, $this->allProperties[$item]['value'], $this->allProperties[$item]['name'] ); } else if ($this->login_credentials['login_type'] == 'reseller') { // logged in as reseller if ($this->allProperties[$item]['permission'] == 'admin') { if ($customer->id == $customer->reseller ) { // reseller cannot modify himself for items with admin permission if (!$this->allProperties[$item]['invisible']) { printf ("", ucfirst($this->allProperties[$item]['permission']), $this->allProperties[$item]['name'], $this->allProperties[$item]['value'] ); } } else { if ($this->allProperties[$item]['resellerMayManageForChildAccounts']) { // reseller can manage these properties for his customers printf ("", 'Reseller', $this->allProperties[$item]['name'], $item, $this->allProperties[$item]['value'] ); } else { if (!$this->allProperties[$item]['invisible']) { // otherwise cannot modify them printf ("", ucfirst($this->allProperties[$item]['permission']), $this->allProperties[$item]['name'], $this->allProperties[$item]['value'] ); } } } } else { printf ("", ucfirst($this->allProperties[$item]['permission']), $this->allProperties[$item]['name'], $item, $this->allProperties[$item]['value'] ); } } else { // logged in as customer if ($this->allProperties[$item]['permission'] == 'admin' || $this->allProperties[$item]['permission'] == 'reseller' ) { if (!$this->allProperties[$item]['invisible']) { printf ("", $this->allProperties[$item]['name'], $this->allProperties[$item]['value'] ); } } else { printf ("", $this->allProperties[$item]['name'], $item, $this->allProperties[$item]['value'] ); } } } print "
Category Level Property Value Description
Level Property Value
Property Value
%s %s %s %s
%s %s %s
%s %s
%s %s %s
%s %s
%s %s
%s
"; $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
"; $this->showRecordFooter($customer); } function updateRecord () { //print "

Updating customer ..."; if (!strlen($this->filters['customer'])) { return false; } if (!$customer=$this->getRecord($this->filters['customer'])) { return false; } if ($_REQUEST['notify']) { $customer_notify=array('firstName'=> $customer->firstName, 'lastName' => $customer->lastName, 'email' => $customer->email, 'username' => $customer->username, 'password' => $customer->password ); if ($this->notify($customer_notify)) { print "

"; printf (_("The login account details have been sent to %s"), $customer->email); return true; } else { print "

"; printf (_("Error sending e-mail notification")); return false; } } if (!$this->updateBefore($customer)) { return false; } $customer->credit = floatval($customer->credit); $customer->balance = floatval($customer->balance); foreach ($customer->properties as $_property) { $properties[]=$_property; } if (is_array($properties)) { $customer->properties=$properties; } else { $customer->properties=array(); } $customer_old = $customer; // update properties foreach (array_keys($this->allProperties) as $item) { $var_name = $item.'_form'; $updated_property=array(); foreach (array_keys($customer->properties) as $_key) { $_property=$customer->properties[$_key]; if ($_property->name == $item) { // update property if ($_property->permission == 'admin') { if ($this->login_credentials['login_type'] == 'admin') { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); } else if ($this->login_credentials['login_type'] == 'reseller' && $this->allProperties[$item]['resellerMayManageForChildAccounts']) { if ($customer->id != $customer->reseller) { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); } } } else if ($_property->permission == 'reseller') { if ($this->login_credentials['login_type'] == 'admin' || $this->login_credentials['login_type'] == 'reseller') { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); } } else { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); if ($_key == 'yubikey' && $_REQUEST[$var_name] != '') { $customer->properties[$_key]->value = substr($customer->properties[$_key]->value,0,12); } } $updated_property[$item]++; break; } } if (!$updated_property[$item] && strlen($_REQUEST[$var_name])) { // add new property unset($var_value); unset($_permission); if ($this->allProperties[$item]['permission'] == 'admin') { $_permission = 'admin'; if ($this->login_credentials['login_type'] == 'admin') { $var_value = trim($_REQUEST[$var_name]); } else if ($this->login_credentials['login_type'] == 'reseller' && $this->allProperties[$item]['resellerMayManageForChildAccounts']) { if ($customer->id != $customer->reseller) { $var_value = trim($_REQUEST[$var_name]); } } } else if ($this->allProperties[$item]['permission'] == 'reseller') { $_permission = 'reseller'; if ($this->login_credentials['login_type'] == 'admin' || $this->login_credentials['login_type'] == 'reseller') { $var_value = trim($_REQUEST[$var_name]); } } else { $_permission = 'customer'; $var_value = trim($_REQUEST[$var_name]); } if (strlen($var_value)) { if ($item == 'yubikey' ) { $var_value = substr($var_value,0,12); } $customer->properties[] = array('name' => $item, 'value' => $var_value, 'category' => $this->allProperties[$item]['category'], 'permission' => $this->allProperties[$item]['permission'] ); } } } /* print "

";
         print_r($customer->properties);
         print "
"; */ foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer' || $this->Fields[$item]['type'] == 'boolean') { $customer->$item = intval($_REQUEST[$var_name]); } else if ($this->Fields[$item]['type'] == 'float') { $customer->$item = floatval($_REQUEST[$var_name]); } else { $customer->$item = strip_tags(trim($_REQUEST[$var_name])); } } $customer->tel = preg_replace("/[^\+0-9]/","",$customer->tel); $customer->fax = preg_replace("/[^\+0-9]/","",$customer->fax); $customer->enum = preg_replace("/[^\+0-9]/","",$customer->enum); if (!strlen($_REQUEST['password_form'])) $customer->password = $this->RandomString(6); if (!strlen($_REQUEST['state_form'])) $customer->state = 'N/A'; if (!strlen($_REQUEST['country_form'])) $customer->country = 'N/A'; if (!strlen($_REQUEST['city_form'])) $customer->city = 'Unknown'; if (!strlen($_REQUEST['address_form'])) $customer->address = 'Unknown'; if (!strlen($_REQUEST['postcode_form'])) $customer->postcode = 'Unknown'; if (!strlen($_REQUEST['tel_form'])) $customer->tel = '+19999999999'; if ($customer->reseller != $customer->id) { // a subaccount cannot change his own impersonate field if (!$this->adminonly) { if ($this->customer != $customer->reseller) { $customer->impersonate=$customer_old->impersonate; } } } $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($customer), 'logs' => array('success' => sprintf('Customer id %s has been updated',$customer->id))) ); //dprint_r($customer); if ($this->SoapEngine->execute($function,$this->html,$this->adminonly)) { $this->updateAfter($customer,$customer_old); return true; } else { return false; } } function showTimezones($timezone) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } print ""; } function getChildren($reseller) { return; // Filter $filter=array('reseller' => intval($reseller)); // Range $range=array('start' => 0, 'count' => 1000 ); // Order $orderBy = array('attribute' => 'firstName', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclient->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $i=0; if ($result->total > 100) return; while ($i < $result->total) { $customer = $result->accounts[$i]; $this->children[$customer->id]=array('firstName' => $customer->firstName, 'lastName' => $customer->lastName, 'organization' => $customer->organization ); $i++; } } } function copyRecord () { //print "

Copy customer ..."; if (!strlen($this->filters['customer'])) { return false; } if (!$_REQUEST['confirm']) { print "

Please press on Copy again to confirm the copy"; return true; } if (!$customer=$this->getRecord($this->filters['customer'])) { return false; } $customer->credit = floatval($customer->credit); $customer->balance = floatval($customer->balance); foreach ($customer->properties as $_property) { $properties[]=$_property; } if (is_array($properties)) { $customer->properties=$properties; } else { $customer->properties=array(); } // change username $customer_new=$customer; unset($customer_new->id); $j=1; while ($j < 9) { $customer_new->username=$customer->username.$j; $function=array('commit' => array('name' => 'addAccount', 'parameters' => array($customer_new), 'logs' => array('success' => sprintf('Customer id %s has been copied',$customer->id))) ); if ($this->SoapEngine->execute($function,$this->html)) { // Reset filters to find the copy $this->filters=array(); $this->filters['username']=$customer_new->username; return true; } else { if ($this->SoapEngine->error_fault->detail->exception->errorcode != "5001") { return false; } } $j++; } } function showAddForm($confirmPassword=false) { print "

Add new account

"; print "

"; print _("Accounts are used for login and to assign ownership to data created in the platform. "); printf ("

",$_SERVER['PHP_SELF']); print "

"; if ($this->adminonly && $this->filters['reseller']) { printf ("

Reseller %s
Reseller %s
%s
"; print _("ENUM number generator"); print "
"; print " "; print " "; if ($_REQUEST['add_prefix']) { $add_prefix=$_REQUEST['add_prefix']; } else { $add_prefix = $this->sipRecords->getCustomerProperty('enum_generator_add_prefix'); } print " ",$add_prefix); if ($_REQUEST['number_length']) { $number_length=$_REQUEST['number_length']; } else { $number_length = $this->sipRecords->getCustomerProperty('enum_generator_number_length'); } print " "; if ($_REQUEST['strip_digits']) { $strip_digits=$_REQUEST['strip_digits']; } else if ($strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_strip_digits')) { } else { $strip_digits=0; } print " ",$strip_digits); print " "; print " "; if (count($this->sipRecords->allowedDomains) > 0) { print " "; print " "; print " ",$checked_create_sip); if ($_REQUEST['pstn']) { $checked_pstn='checked'; } else { $checked_pstn=''; } print " ",$checked_pstn); if ($_REQUEST['prepaid']) { $checked_prepaid='checked'; } else { $checked_prepaid=''; } print " ",$checked_prepaid); if ($_REQUEST['rpid_strip_digits']) { $rpid_strip_digits=$_REQUEST['rpid_strip_digits']; } else if ($rpid_strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_rpid_strip_digits')) { } else { $rpid_strip_digits=0; } print " ",$rpid_strip_digits); print " ",$_REQUEST['quota']); print " ",$_REQUEST['password']); if (isset($_REQUEST['call_limit'])) { $call_limit=$_REQUEST['call_limit']; } else { $call_limit = $this->sipRecords->getCustomerProperty('enum_generator_call_limit'); } if (!strlen($call_limit) && strlen($this->default_call_limit)) { $call_limit = $this->default_call_limit; } print " ",$call_limit); if (isset($_REQUEST['ip_access_list'])) { $ip_access_list=$_REQUEST['ip_access_list']; } else { $ip_access_list = $this->sipRecords->getCustomerProperty('enum_generator_ip_access_list'); } if (!$ip_access_list && $this->default_ip_access_list) { $ip_access_list = $this->default_ip_access_list; } print " ",$ip_access_list); } if ($_REQUEST['nr_records']) { $nr_records=$_REQUEST['nr_records']; } else { $nr_records=1; } print " "; print " "; print " "; $this->printHiddenFormElements(); print "
"; print _("ENUM range"); print " "; /* if ($_REQUEST['range']) { $selected_range[$_REQUEST['range']]='selected'; } else if ($_last_range=$this->enumRecords->getCustomerProperty('enum_generator_range')) { $selected_range[$_last_range] = 'selected'; } if (is_array($this->enumRecords->ranges)) { print ""; } */ list($_range['prefix'],$_range['tld'])=explode("@",$_REQUEST['range']); printf ("+%s under %s",$_REQUEST['range'],$_range['prefix'],$_range['tld']); print "
"; print ""; print _("ENUM mapping template"); print ""; print "
"; print _("Add prefix after range:"); printf ("
"; print _("Number length:"); printf ("
",$number_length); print _("SIP domain:"); print " "; if (count($this->sipRecords->allowedDomains) > 0) { if ($_REQUEST['domain']) { $selected_domain[$_REQUEST['domain']]='selected'; } else if ($_last_domain=$this->sipRecords->getCustomerProperty('enum_generator_sip_domain')) { $selected_domain[$_last_domain] = 'selected'; } print " "; } else { print ""; } print " "; print "
"; print _("Strip digits:"); printf ("
"; print _("Owner:"); printf (" ",$_REQUEST['owner']); print "
"; print _("Info:"); printf (" ",$_REQUEST['info']); print "

"; print ""; print _("SIP account template"); print ""; print "
"; print _("Create SIP records"); if ($_REQUEST['create_sip']) { $checked_create_sip='checked'; } else { $checked_create_sip=''; } printf ("
"; print _("PSTN access"); printf ("
"; print _("Prepaid"); printf ("
"; print _("Strip digits from Caller-ID"); printf ("
"; print _("Quota"); printf ("
"; print _("Password"); printf ("
"; print _("PSTN call limit"); printf ("
"; print _("IP access list"); printf ("

"; print ""; print ""; printf (" Number of records: ",$nr_records); print ""; print "

"; print _("Existing records will not be overwritten. "); print "

"; } function checkGenerateRequest() { // check number of records $this->template['create_sip']=trim($_REQUEST['create_sip']); $ip_access_list = preg_replace("/\s+/"," ", $_REQUEST['ip_access_list']); if (strlen($ip_access_list) and !check_ip_access_list(trim($ip_access_list), true)) { printf ("Error: IP access lists must be a space separated list of IP network/mask, example: 10.0.20.40/24"); return false; } $this->template['ip_access_list'] = trim($ip_access_list); if (strlen($_REQUEST['call_limit']) && !is_numeric($_REQUEST['call_limit'])) { printf ("Error: PSTN call limit must be numeric"); return false; } $this->template['call_limit']=$_REQUEST['call_limit']; $this->template['rpid_strip_digits']=intval($_REQUEST['rpid_strip_digits']); $this->template['info']=trim($_REQUEST['info']); $nr_records=trim($_REQUEST['nr_records']); if (!is_numeric($nr_records) || $nr_records < 1 || $nr_records > $this->maxRecords) { printf ("Error: number of records must be a number between 1 and %d",$this->maxRecords); return false; } $this->template['nr_records'] = $nr_records; $number_length=trim($_REQUEST['number_length']); if (!is_numeric($number_length) || $number_length < $this->minimum_number_length || $number_length > $this->maximum_number_length) { printf ("Error: number length must be a number between 4 and 15",$this->minimum_number_length,$this->maximum_number_length); return false; } $this->template['number_length'] = $number_length; $strip_digits=trim($_REQUEST['strip_digits']); if (!is_numeric($strip_digits) || $strip_digits < 0 || $number_length < $strip_digits + 3) { printf ("Error: strip digits + 3 must be smaller then %d",$number_length); return false; } $this->template['strip_digits'] = $strip_digits; // sip domain $domain=trim($_REQUEST['domain']); if (!strlen($domain)) { print "Error: SIP domain is missing"; return false; } $this->template['domain'] = $domain; $add_prefix=trim($_REQUEST['add_prefix']); if (strlen($add_prefix) && !is_numeric($add_prefix)) { print "Error: Add prefix must be numeric"; return false; } $this->template['add_prefix'] = $add_prefix; $owner=trim($_REQUEST['owner']); if (strlen($owner) && !is_numeric($owner)) { print "Error: Owner must be an integer"; return false; } // check ENUM TLD list($rangePrefix,$tld)=explode('@',trim($_REQUEST['range'])); $this->template['range'] = trim($_REQUEST['range']); $this->template['rangePrefix'] = $rangePrefix; $this->template['tld'] = $tld; $this->template['quota'] = intval($_REQUEST['quota']); $this->template['owner'] = intval($owner); $this->template['pstn'] = intval($_REQUEST['pstn']); $this->template['prepaid'] = intval($_REQUEST['prepaid']); $this->template['password'] = trim($_REQUEST['password']); /////////////////////////////////////// // logical checks if (strlen($this->template['add_prefix'])) { $start = $this->template['add_prefix']; } else { $start = 0; } $this->template['digitsAfterRange'] = $this->template['number_length'] - strlen($this->template['rangePrefix']); if ($this->template['number_length'] == strlen($this->template['rangePrefix']) + strlen($this->template['add_prefix'])) { $this->template['firstNumber'] = $this->template['rangePrefix'].$this->template['add_prefix']; $this->template['lastNumber'] = substr($this->template['firstNumber'],0,-1).'9'; $this->template['maxNumbers'] = $this->template['lastNumber'] - $this->template['firstNumber'] + 1; } else { $this->template['firstNumber'] = $this->template['rangePrefix'].str_pad($start,$this->template['digitsAfterRange'],'0'); $this->template['lastNumber'] = sprintf("%.0f", $this->template['firstNumber'] + pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])) - 1); $this->template['maxNumbers'] = pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])); } dprint_r($this->template); if ($this->template['maxNumbers'] < $this->template['nr_records']) { printf ("Error: Insufficient numbers in range, requested = %d, available = %d",$this->template['nr_records'],$this->template['maxNumbers']); return false; } return true; } function generateRecords() { print "

"; if (!$this->checkGenerateRequest()) { return false; } print "

Generating records

    "; $_p=array( array('name' => 'enum_generator_sip_domain', 'category' => 'web', 'value' => strval($this->template['domain']), 'permission' => 'customer' ), array('name' => 'enum_generator_range', 'category' => 'web', 'value' => strval($this->template['range']), 'permission' => 'customer' ), array('name' => 'enum_generator_strip_digits', 'category' => 'web', 'value' => strval($this->template['strip_digits']), 'permission' => 'customer' ), array('name' => 'enum_generator_number_length', 'category' => 'web', 'value' => strval($this->template['number_length']), 'permission' => 'customer' ), array('name' => 'enum_generator_add_prefix', 'category' => 'web', 'value' => strval($this->template['add_prefix']), 'permission' => 'customer' ), array('name' => 'enum_generator_rpid_strip_digits', 'category' => 'web', 'value' => strval($this->template['rpid_strip_digits']), 'permission' => 'customer' ), array('name' => 'enum_generator_call_limit', 'category' => 'web', 'value' => strval($this->template['call_limit']), 'permission' => 'customer' ), array('name' => 'enum_generator_ip_access_list', 'category' => 'web', 'value' => strval($this->template['ip_access_list']), 'permission' => 'customer' ) ); $this->enumRecords->setCustomerProperties($_p); if ($this->template['owner']) { if ($customer = $this->customerRecords->getRecord($this->template['owner'])) { $this->template['email'] = $customer->email; $this->template['firstName'] = $customer->firstName; $this->template['lastName'] = $customer->lastName; if (!strlen($this->template['info'])) { $this->template['info'] = $customer->firstName.' '.$customer->lastName; } } else { printf ("Error: cannot retrieve customer information for owner %d",$this->template['owner']); } } dprint_r($this->template); $i=0; while ($i < $this->template['nr_records']) { $number = sprintf("%.0f", $this->template['firstNumber'] + $i); $username = substr($number,$this->template['strip_digits']); $mapto = 'sip:'.$username.'@'.$this->template['domain']; print "
  1. "; printf ('Generating number +%s with mapping %s ',$number,$mapto); flush(); $enumMapping = array('tld' => $this->template['tld'], 'number' => $number, 'type' => 'sip', 'mapto' => $mapto, 'info' => $this->template['info'], 'owner' => $this->template['owner'] ); if ($this->template['create_sip']) { if (preg_match("/^0/",$username)) { printf ('SIP accounts starting with 0 are not generated (%s@%s)',$username,$this->template['domain']); continue; } $groups=array(); printf ('and sip account %s@%s ',$username,$this->template['domain']); $ip_access_list = check_ip_access_list($this->template['ip_access_list']); $sipAccount = array('account' => $username.'@'.$this->template['domain'], 'quota' => $this->template['quota'], 'prepaid' => $this->template['prepaid'], 'password' => $this->template['password'], 'groups' => $groups, 'owner' => $this->template['owner'], 'pstn' => $this->template['pstn'], 'ip_access_list' => $ip_access_list, 'call_limit' => $this->template['call_limit'] ); if ($this->template['firstName']) { $sipAccount['fullname'] = $this->template['firstName'].' '.$this->template['lastName']; } if ($this->template['email']) { $sipAccount['email'] = $this->template['email']; } if ($this->template['pstn']) { $strip_rpid=intval($this->template['rpid_strip_digits']); if ($strip_rpid && strlen($number) > $strip_rpid) { $sipAccount['rpid']=substr($number,intval($this->template['rpid_strip_digits'])); } else { $sipAccount['rpid']=$number; } } } else { unset($sipAccount); } dprint_r($sipAccount); if (is_array($enumMapping)) $this->enumRecords->addRecord($enumMapping); if (is_array($sipAccount)) $this->sipRecords->addRecord($sipAccount); $i++; } print "
"; return true; } function printHiddenFormElements () { printf("",$this->generatorId); if ($this->adminonly) { printf("",$this->adminonly); } if ($this->template['customer']) { printf("",$this->template['customer']); } if ($this->template['reseller']) { printf("",$this->template['reseller']); } foreach (array_keys($this->EnumSoapEngine->extraFormElements) as $element) { if (!strlen($this->EnumSoapEngine->extraFormElements[$element])) continue; printf ("\n",$element,$this->EnumSoapEngine->extraFormElements[$element]); } } function getSoapEngineAllowed($soapEngines,$filter) { // filter syntax: // $filter="engine1:port1,port2,port3 engine2 engine3"; // where engine is a connection from ngnpro_engines.inc and // port is valid port from that engine like sip_accounts or enum_numbers $_filter_els=explode(" ",trim($filter)); foreach(array_keys($soapEngines) as $_engine) { foreach ($_filter_els as $_filter) { unset($_allowed_engine); $_allowed_ports=array(); list($_allowed_engine,$_allowed_ports_els) = explode(":",$_filter); if ($_allowed_ports_els) { $_allowed_ports = explode(",",$_allowed_ports_els); } if ($_engine == $_allowed_engine) { $soapEngines_checked[$_engine]=$soapEngines[$_engine]; $this->allowedPorts[$_engine]=$_allowed_ports; continue; } } } return $soapEngines_checked; } } class Actions { // this class perfom actions on an array of entities returned by selections var $actions = array(); var $version = 1; var $sub_action_parameter_size = 35; var $html = true; function Actions($SoapEngine, $login_credentials) { $this->SoapEngine = $SoapEngine; $this->login_credentials = $login_credentials; $this->version = $this->SoapEngine->version; $this->adminonly = $this->SoapEngine->adminonly; } function log_action($action='Unknown') { global $CDRTool; $location = "Unknown"; $_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $location = $_loc['country_name']; } $log = sprintf("CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s", $this->login_credentials['username'], $this->login_credentials['login_type'], $CDRTool['impersonate'], $_SERVER['REMOTE_ADDR'], $location, $this->SoapEngine->port, $action, $_SERVER['PHP_SELF'] ); syslog(LOG_NOTICE, $log); } function execute($selectionKeys, $action, $sub_action_parameter) { } function showActionsForm($filters,$sorting,$hideParameter=false) { if (!count($this->actions)) return; printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; if ($this->adminonly) { print " adminonly> "; } print ""; if (!$hideParameter) { printf (" ",$this->sub_action_parameter_size); } print "

"; print " Maximum of 500 records

"; foreach (array_keys($filters) as $_filter) { printf ("\n", $_filter,$filters[$_filter]); } foreach (array_keys($sorting) as $_sorting) { printf ("\n", $_sorting,$sorting[$_sorting]); } printf("",$this->SoapEngine->service); foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; printf ("\n",$element,$this->SoapEngine->extraFormElements[$element]); } print "
"; } } class SipAccountsActions extends Actions { var $actions=array('block' => 'Block SIP accounts', 'deblock' => 'Deblock SIP accounts', 'enable_pstn' => 'Enable access to PSTN for the SIP accounts', 'disable_pstn' => 'Disable access to PSTN for the SIP accounts', 'deblock_quota' => 'Deblock SIP accounts blocked by quota', 'prepaid' => 'Make SIP accounts prepaid', 'postpaid' => 'Make SIP accounts postpaid', 'delete' => 'Delete SIP accounts', 'setquota' => 'Set quota of SIP account to:', 'rpidasusername' => 'Set PSTN caller ID as the username', 'prefixtorpid' => 'Add to PSTN caller ID this prefix:', 'rmdsfromrpid' => 'Remove from PSTN caller ID digits:', 'addtogroup' => 'Add SIP accounts to group:', 'removefromgroup'=> 'Remove SIP accounts from group:', 'addbalance' => 'Add to prepaid balance value:', 'changeowner' => 'Change owner to:', 'changefirstname'=> 'Change first name to:', 'changelastname' => 'Change last name to:', 'changepassword' => 'Change password to:' ); function SipAccountsActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); //printf ("Performing action=%s on key=%s",$action,$key); $account=array('username' => $key['username'], 'domain' => $key['domain'] ); printf ("
  1. %s@%s",$key['username'],$key['domain']); if ($action=='block') { $this->log_action('addToGroup'); $function=array('commit' => array('name' => 'addToGroup', 'parameters' => array($account,'blocked'), 'logs' => array('success' => sprintf('SIP account %s@%s has been blocked',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='deblock') { $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,'blocked'), 'logs' => array('success' => sprintf('SIP account %s@%s has been de-blocked',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='removefromgroup') { if (!strlen($sub_action_parameter)) { printf ("Error: you must enter a group name"); break; } $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,$sub_action_parameter), 'logs' => array('success' => sprintf('SIP account %s@%s has been removed from group %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='addtogroup') { $this->log_action('addToGroup'); if (!strlen($sub_action_parameter)) { printf ("Error: you must enter a group name"); break; } $function=array('commit' => array('name' => 'addToGroup', 'parameters' => array($account,$sub_action_parameter), 'logs' => array('success' => sprintf('SIP account %s@%s is now in group %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='deblock_quota') { $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,'quota'), 'logs' => array('success' => sprintf('SIP account %s@%s has been deblocked from quota',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='disable_pstn') { $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,'free-pstn'), 'logs' => array('success' => sprintf('SIP account %s@%s has no access to the PSTN',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='enable_pstn') { $this->log_action('addToGroup'); $function=array('commit' => array('name' => 'addToGroup', 'parameters' => array($account,'free-pstn'), 'logs' => array('success' => sprintf('SIP account %s@%s has access to the PSTN',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='delete') { $this->log_action('deleteAccount'); $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array($account), 'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='prepaid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $result->prepaid=1; $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s is now prepaid',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='postpaid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $result->prepaid=0; $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s is now postpaid',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='setquota') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->quota = intval($sub_action_parameter); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has quota set to %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='rmdsfromrpid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter) && strlen($result->rpid) > $sub_action_parameter) { printf("%s %s",$result->rpid,$sub_action_parameter); $result->rpid=substr($result->rpid,$sub_action_parameter); printf("%s %s",$result->rpid,$sub_action_parameter); } else { printf ("Error: '%s' must be numeric and less than caller if length",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$result->rpid) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='rpidasusername') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($key['username'])) $result->rpid=$key['username']; $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$key['username']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='prefixtorpid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter)) { $result->rpid=$sub_action_parameter.$result->rpid; } else { printf ("Error: '%s' must be numeric",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s ',$key['username'],$key['domain'],$result->rpid) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changecustomer') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter)) { $result->customer=intval($sub_action_parameter); } else { printf ("Error: '%s' must be numeric",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has customer set to %s ',$key['username'],$key['domain'],$result->customer) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changeowner') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter)) { $result->owner=intval($sub_action_parameter); } else { printf ("Error: '%s' must be numeric",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has owner set to %s ',$key['username'],$key['domain'],$result->owner) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changefirstname') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->firstName=trim($sub_action_parameter); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s first name has been set to %s ',$key['username'],$key['domain'],$result->firstName) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changelastname') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->lastName=trim($sub_action_parameter); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s last name has been set to %s ',$key['username'],$key['domain'],$result->lastName) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changepassword') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->password=trim($sub_action_parameter); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('Password for SIP account %s@%s has been changed',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='addbalance') { if (!is_numeric($sub_action_parameter)) { printf ("Error: you must enter a positive balance"); break; } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } if (!$result->prepaid) { printf ("Info: SIP account %s@%s is not prepaid, no action performed",$key['username'],$key['domain']); continue; } $this->log_action('addBalance'); $function=array('commit' => array('name' => 'addBalance', 'parameters' => array($account,$sub_action_parameter), 'logs' => array('success' => sprintf('SIP account %s@%s balance has been increased with %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } print "
"; } } class SipAliasesActions extends Actions { var $actions=array( 'delete' => 'Delete SIP aliases' ); function SipAliasesActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { print "
  1. "; flush(); //printf ("Performing action=%s on key=%s",$action,$key); $alias=array('username' => $key['username'], 'domain' => $key['domain'] ); if ($action=='delete') { $this->log_action('deleteAlias'); $function=array('commit' => array('name' => 'deleteAlias', 'parameters' => array($alias), 'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } print "
"; } } class EnumMappingsActions extends Actions { var $actions=array( 'changettl' => 'Change TTL to:', 'changeowner' => 'Change owner to:', 'changeinfo' => 'Change info to:', 'delete' => 'Delete ENUM mappings' ); var $mapping_fields=array('id' => 'integer', 'type' => 'text', 'mapto' => 'text', 'priority' => 'integer', 'ttl' => 'integer' ); function EnumMappingsActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); print "
  1. "; $enum_id=array('number' => $key['number'], 'tld' => $key['tld'] ); if ($action=='delete') { //printf ("Performing action=%s on key=%s",$action,$key); $function=array('commit' => array('name' => 'deleteNumber', 'parameters' => array($enum_id), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$key['number'],$key['tld']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action == 'changettl') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $number = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($number)) { $error_msg = $number->getMessage(); $error_fault= $number->getFault(); $error_code = $number->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: TTL '%s' must be numeric",$sub_action_parameter); continue; } $new_mappings=array(); foreach ($number->mappings as $_mapping) { foreach (array_keys($this->mapping_fields) as $field) { if ($field == 'ttl') { $new_mapping[$field]=intval($sub_action_parameter); } else { if ($this->mapping_fields[$field] == 'integer') { $new_mapping[$field]=intval($_mapping->$field); } else { $new_mapping[$field]=$_mapping->$field; } } } $new_mappings[]=$new_mapping; } $number->mappings=$new_mappings; $this->log_action('updateNumber'); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number %s@%s TTL has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeowner') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $number = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($number)) { $error_msg = $number->getMessage(); $error_fault= $number->getFault(); $error_code = $number->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $new_mappings=array(); foreach ($number->mappings as $_mapping) { $new_mappings[]=$_mapping; } $number->mappings=$new_mappings; if (is_numeric($sub_action_parameter)) { $number->owner=intval($sub_action_parameter); } else { printf ("Error: Owner '%s' must be numeric",$sub_action_parameter); continue; } $this->log_action('updateNumber'); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number %s@%s owner has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeinfo') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $number = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($number)) { $error_msg = $number->getMessage(); $error_fault= $number->getFault(); $error_code = $number->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $new_mappings=array(); foreach ($number->mappings as $_mapping) { $new_mappings[]=$_mapping; } $number->mappings=$new_mappings; $number->info=trim($sub_action_parameter); $this->log_action('updateNumber'); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number %s@%s info has been set to %s',$key['number'],$key['tld'],trim($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } } print "
"; } } class DnsRecordsActions extends Actions { var $sub_action_parameter_size = 50; var $actions = array( 'changettl' => 'Change TTL to:', 'changepriority' => 'Change Priority to:', 'changevalue' => 'Change value to:', 'delete' => 'Delete records' ); function DnsRecordsActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys, $action, $sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); print "
  1. "; //printf ("Performing action=%s on key=%s",$action,$key['id']); if ($action=='delete') { $this->log_action('deleteRecord'); $function=array('commit' => array('name' => 'deleteRecord', 'parameters' => array(intval($key['id'])), 'logs' => array('success' => sprintf('Record %d has been deleted',$key['id']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action == 'changettl') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecord'); $record = $this->SoapEngine->soapclient->getRecord($key['id']); if ((new PEAR)->isError($record)) { $error_msg = $record->getMessage(); $error_fault= $record->getFault(); $error_code = $record->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: TTL '%s' must be numeric",$sub_action_parameter); continue; } $record->ttl=intval($sub_action_parameter); $this->log_action('updateRecord'); $function=array('commit' => array('name' => 'updateRecord', 'parameters' => array($record), 'logs' => array('success' => sprintf('TTL for record %d has been set to %d',$key['id'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changepriority') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecord'); $record = $this->SoapEngine->soapclient->getRecord($key['id']); if ((new PEAR)->isError($record)) { $error_msg = $record->getMessage(); $error_fault= $record->getFault(); $error_code = $record->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (is_numeric($sub_action_parameter)) { $record->priority=intval($sub_action_parameter); } else { printf ("Error: Priority '%s' must be numeric",$sub_action_parameter); continue; } $this->log_action('updateRecord'); $function=array('commit' => array('name' => 'updateRecord', 'parameters' => array($record), 'logs' => array('success' => sprintf('Priority for record %d has been set to %d',$key['id'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changevalue') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecord'); $record = $this->SoapEngine->soapclient->getRecord($key['id']); if ((new PEAR)->isError($record)) { $error_msg = $record->getMessage(); $error_fault= $record->getFault(); $error_code = $record->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $record->value=$sub_action_parameter; $this->log_action('updateRecord'); $function=array('commit' => array('name' => 'updateRecord', 'parameters' => array($record), 'logs' => array('success' => sprintf('Value of record %d has been set to %s',$key['id'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } } print "
"; } } class DnsZonesActions extends Actions { var $sub_action_parameter_size = 50; var $actions=array( 'changettl' => 'Change TTL to:', 'changeexpire' => 'Change Expire to:', 'changeminimum' => 'Change Minimum to:', 'changeretry' => 'Change Retry to:', 'changeinfo' => 'Change Info to:', 'addnsrecord' => 'Add name server:', 'removensrecord' => 'Remove name server:', 'delete' => 'Delete zones', 'export' => 'Export zones' ); function DnsZonesActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } if ($action!='export') { print "
    "; } else { $exported_data=array('dns_zones'=>array()); $export_customers=array(); } foreach($selectionKeys as $key) { flush(); if ($action!='export') { print "
  1. "; } //printf ("Performing action=%s on key=%s",$action,$key['name']); if ($action=='delete') { $this->log_action('deleteZone'); $function=array('commit' => array('name' => 'deleteZone', 'parameters' => array($key['name']), 'logs' => array('success' => sprintf('Zone %s has been deleted',$key['name']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='export') { // Filter $filter=array( 'zone' => $key['name'] ); $range = array('start' => 0,'count' => 5000); // Compose query $Query=array('filter' => $filter, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $result = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if (!in_array($result->customer, $export_customers)) { $export_customers[]=$result->customer; } if (!in_array($result->reseller, $export_customers)) { $export_customers[]=$result->reseller; } $exported_data['dns_zones'][] = objectToArray($result); } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecords'); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,'getRecords'),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['dns_records'] = objectToArray($result->records); } } else if ($action == 'changettl') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: TTL '%s' must be numeric",$sub_action_parameter); continue; } $zone->ttl=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('TTL for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeexpire') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: Expire '%s' must be numeric",$sub_action_parameter); continue; } $zone->expire=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Expire for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeminimum') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: Minimum '%s' must be numeric",$sub_action_parameter); continue; } $zone->minimum=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Minimum for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'addnsrecord') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $zone->nameservers[]=$sub_action_parameter; $zone->nameservers=array_unique($zone->nameservers); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Added NS record %s for zone %s',$sub_action_parameter,$key['name']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'removensrecord') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $new_servers=array(); foreach ($zone->nameservers as $_ns) { if ($_ns == $sub_action_parameter) continue; $new_servers[]=$_ns; } $zone->nameservers=array_unique($new_servers); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('NS record %s removed from zone %s',$sub_action_parameter,$key['name']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeretry') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: Retry '%s' must be numeric",$sub_action_parameter); continue; } $zone->retry=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Retry for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeinfo') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $zone->info=$sub_action_parameter; $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Info for zone %s has been set to %s',$key['name'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } } if ($action!='export') { print "
"; } else { // Filter foreach ($export_customers as $customer) { $filter=array( 'customer' => intval($customer), ); // Compose query $Query=array('filter' => $filter ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $this->getCustomers('getZone'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['customers'] = objectToArray($result->accounts); } } print_r(json_encode($exported_data)); } } } class CustomersActions extends Actions { var $actions=array( 'delete' => 'Delete customers' ); function CustomerActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); print "
  1. "; if ($action=='delete') { $this->log_action('deleteAccount'); $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array(intval($key)), 'logs' => array('success' => sprintf('Customer id %s has been deleted',$key))) ); $this->SoapEngine->execute($function,$this->html); } } print "
"; } } function check_ip_access_list($acl_string, $check=false) { $list=explode(" ",$acl_string); $ip_access_list = array(); foreach ($list as $el) { $els = explode("/",$el); if (count($els) != 2) { if ($check) { return false; } else { continue; } } list($ip,$mask) = $els; if ($mask <0 or $mask > 32) { if ($check) { return false; } else { continue; } } if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) { if ($check) { return false; } else { continue; } } $ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask)); } if ($check) { return true; } else { return $ip_access_list; } } function objectToArray($d) { if (is_object($d)) { // Gets the properties of the given object // with get_object_vars function $d = get_object_vars($d); } if (is_array($d)) { /* * Return array converted to object * Using __FUNCTION__ (Magic constant) * for recursive call */ return array_map(__FUNCTION__, $d); } else { // Return array return $d; } } ?> diff --git a/library/sip_settings.php b/library/sip_settings.php index c09b4f3..f2998a8 100644 --- a/library/sip_settings.php +++ b/library/sip_settings.php @@ -1,13091 +1,13119 @@ "; var $billing_email = "Billing "; var $sip_settings_page = "https://cdrtool.example.com/sip_settings.phtml"; var $xcap_root = "https://cdrtool.example.com/xcap-root"; var $pstn_access = false; var $sms_access = false; var $pstn_changes_allowed = false; var $prepaid_changes_allowed = false; var $sip_proxy = "proxy.example.com"; var $sip_outbound_proxy = ""; var $sip_mobile_outbound_proxy = ""; var $voicemail_server = "vm.example.com"; var $absolute_voicemail_uri = false; // use var $enable_thor = false; var $currency = "€"; // access numbers var $voicemail_access_number = "1233"; var $FUNC_access_number = "*21*"; var $FNOL_access_number = "*22*"; var $FNOA_access_number = "*23*"; var $FBUS_access_number = "*23*"; var $change_privacy_access_number = "*67"; var $check_privacy_access_number = "*68"; var $reject_anonymous_access_number = "*69"; var $show_barring_tab = false; var $show_payments_tab = false; var $show_tls_section = false; var $show_support_tab = false; var $show_did_tab = false; var $show_directory = false; var $notify_on_sip_account_changes = false; var $first_tab = 'calls'; var $auto_refesh_tab = 0; // number of seconds after which to refresh tab content in the web browser var $payment_processor_class = false; var $did_processor_class = false; var $show_download_tab = 'Blink'; // set it to name of the tab or false to disable it var $digest_settings_page = "https://blink.sipthor.net/settings.phtml"; // end variables var $tab = "settings"; var $phonebook_img = ""; var $call_img = "
"; var $delete_img = "Delete"; var $plus_sign_img = "Add Contact"; var $embedded_img = ""; var $groups = array(); var $form_elements = array( 'mailto', 'free-pstn', 'blocked', 'sip_password', 'web_password', 'yubikey', 'first_name', 'last_name', 'quota', 'language', 'quota_deblock', 'voicemail', 'anonymous', 'advanced', 'rpid', 'timezone', 'accept', 'accept_temporary_group', 'accept_temporary_remain', 'web_timestamp', 'web_password_reset', 'acceptDailyStartTime', 'acceptDailyStopTime', 'acceptDailyGroup', 'quickdial', 'delete_voicemail', 'voicemail_password', 'region', 'timeout', 'owner', 'mobile_number', 'extra_groups', 'show_barring_tab', 'ip_access_list', 'callLimit' ); var $disable_extra_groups=true; var $prepaid = 0; var $emergency_regions = array(); var $FNOA_timeoutDefault = 35; var $enums = array(); var $barring_prefixes = array(); var $SipUAImagesPath = "images"; var $SipUAImagesFile = "phone_images.php"; var $balance_history = array(); var $enrollment_url = false; var $sip_settings_api_url= false; var $journalEntries = array(); var $chat_replication_backend = 'mysql'; // mongo or mysql var $owner_information =array(); var $languages=array("en"=>array('name'=>"English", 'timezone'=>'' ), "ro"=>array('name'=>"Română", 'timezone' => 'Europe/Bucharest' ), "nl"=>array('name'=>"Nederlands", 'timezone' => 'Europe/Amsterdam' ), "es"=>array('name'=>"Español", 'timezone' => 'Europe/Madrid' ), "de"=>array('name'=>"Deutsch", 'timezone' => 'Europe/Berlin' ) ); var $pstn_termination_price_page = 'sip_rates_body.html'; var $append_domain_to_xcap_root = false; var $blink_download_url = "https://blink.sipthor.net/download.phtml?download"; var $ownerCredentials = array(); var $localGroups = array(); var $max_credit_per_day = 40; var $enrollment_configuration = "/etc/cdrtool/enrollment/config.ini"; var $require_proof_of_identity = true; var $call_limit_may_by_changed_by = 'reseller'; #subscriber, reseller, admin var $ip_access_list_may_by_changed_by = 'reseller'; #subscriber, reseller, admin var $create_certificate = false; function SipSettings($account,$loginCredentials=array(),$soapEngines=array()) { //define_syslog_variables(); $this->platform_call_limit = _('unlimited'); $this->soapEngines = $soapEngines; $debug=sprintf("

Initialize %s(%s)",get_class($this),$account); dprint($debug); //dprint_r($loginCredentials); $this->loginCredentials = &$loginCredentials; if ($this->isEmbedded()) { $this->login_type = 'subscriber'; } else { if ($loginCredentials['login_type']) { $this->login_type = $loginCredentials['login_type']; } else { $this->login_type = 'subscriber'; } } $this->reseller = $loginCredentials['reseller']; $this->customer = $loginCredentials['customer']; if (strlen($loginCredentials['sip_engine'])) { $this->sip_engine=$loginCredentials['sip_engine']; } else { print _("Error: missing sip_engine in login credentials"); return false; } $this->settingsPage = $_SERVER['PHP_SELF']; if ($_REQUEST['tab']) { $this->tab = $_REQUEST['tab']; } else { $this->tab = $this->first_tab; } $this->initSoapClient(); $this->getAccount($account); if ($this->tab=='calls' && !$_REQUEST['export']) { $this->auto_refesh_tab=180; } $this->admin_url = $this->settingsPage."?account=$this->account&adminonly=1&reseller=$this->reseller&sip_engine=$this->sip_engine"; $this->reseller_url = $this->settingsPage."?account=$this->account&reseller=$this->reseller&sip_engine=$this->sip_engine"; $this->admin_url_absolute = $this->sip_settings_page."?account=$this->account&adminonly=1&reseller=$this->reseller&sip_engine=$this->sip_engine"; if ($this->login_type == "admin") { $this->url=$this->admin_url; $this->hiddenElements=" account\"> reseller> sip_engine> "; } else if ($this->login_type == "reseller" || $this->login_type == "customer") { $this->url=$this->reseller_url; $this->hiddenElements=" account\"> reseller> sip_engine> "; } else { $this->url=$this->settingsPage; if (!$this->isEmbedded()) { $this->url.="?account=$this->account"; } else { $this->url.=sprintf("?1=1&realm=%s",urlencode($_REQUEST['realm'])); if ($_REQUEST['user_agent']) { $this->url.=sprintf("&user_agent=%s",urlencode($_REQUEST['user_agent'])); } } $this->hiddenElements=sprintf(" ", $this->account, $this->sip_engine, $_REQUEST['user_agent'], $_REQUEST['realm'] ); } $this->setLanguage(); if (!$this->username) { dprint ("Record not found."); return false; } $this->availableGroups['blocked'] = array("Group"=>"blocked", "WEBName" =>sprintf(_("Status")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); + $this->availableGroups['trunking'] = array("Group"=>"trunking", + "WEBName" =>sprintf(_("Trunking")), + "SubscriberMayEditIt"=>0, + "SubscriberMaySeeIt"=>0, + "ResellerMayEditIt"=>1, + "ResellerMaySeeIt"=>1 + ); + $this->availableGroups['deny-password-change'] = array("Group"=>"deny-password-change", "WEBName" =>sprintf(_("Deny password change")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->getResellerSettings(); $this->getCustomerSettings(); if ($this->reject_anonymous_access_number) { $_comment = sprintf(_("Dial %s to change"), $this->reject_anonymous_access_number); } else { $_comment = ''; } $this->availableGroups['anonymous-reject']=array("Group"=>$this->anonymous-reject, "WEBName" =>sprintf (_("Reject Anonymous")), "WEBComment"=>$_comment, "SubscriberMaySeeIt"=>1, "SubscriberMayEditIt"=>1, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->availableGroups['missed-calls']=array("Group"=>'missed-calls', "WEBName" =>sprintf (_("Email Missed Calls")), "WEBComment"=>'', "SubscriberMaySeeIt"=>1, "SubscriberMayEditIt"=>1, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->availableGroups=array_merge($this->availableGroups, $this->localGroups); $this->pstnChangesAllowed(); $this->smsChangesAllowed(); $this->prepaidChangesAllowed(); $this->tabs=array('identity'=>_('Identity'), 'devices'=>_('Devices'), 'settings'=>_('Settings'), - 'diversions'=>_('Forwarding'), - 'accept' =>_("DND"), - 'contacts'=>_("Contacts"), 'calls'=>_('History'), ); + if (!in_array("trunking",$this->groups)) { + $this->tabs['diversions']=_('Forwarding'); + $this->tabs['accept']=_('Accept'); + $this->tabs['contacts']=_('Contacts'); + } + if (in_array("free-pstn",$this->groups)) { if ($this->show_barring_tab || $this->Preferences['show_barring_tab']) { $this->tabs['barring']=_("Barring"); } } - if ($this->show_did_tab) { + if ($this->show_did_tab && !in_array("trunking",$this->groups)) { $this->tabs['did']=_("DID"); } - if (!$this->isEmbedded() && $this->show_download_tab) { + if (!$this->isEmbedded() && $this->show_download_tab && !in_array("trunking",$this->groups)) { $this->tabs['download'] = $this->show_download_tab; } $this->acceptDailyProfiles=array('127' => _('Every day'), '31' => _('Weekday'), '96' => _('Weekend'), '1' => _('Monday'), '2' => _('Tuesday'), '4' => _('Wednesday'), '8' => _('Thursday'), '16' => _('Friday'), '32' => _('Saturday'), '64' => _('Sunday') ); $this->PhonebookGroups=array( "vip" =>sprintf(_("VIP")), "business" =>sprintf(_("Business")), "coworkers" =>sprintf(_("Coworkers")), "friends" =>sprintf(_("Friends")), "family" =>sprintf(_("Family")) ); $this->diversionType=array( "FUNC"=>sprintf(_("All Calls")), "FNOL"=>sprintf(_("If Not-Online")), "FBUS"=>sprintf(_("If Busy")), "FNOA"=>sprintf(_("If No-Answer")), "FUNV"=>sprintf(_("If Unavailable")) ); $this->diversionTypeUNV=array( "FUNV"=>sprintf(_("If Unavailable")) ); $this->VoicemaildiversionType=array( "FNOL"=>sprintf(_("If Not-Online")), "FBUS"=>sprintf(_("If Busy")), "FNOA"=>sprintf(_("If No-Answer")), "FUNV"=>sprintf(_("If Unavailable")) ); $this->access_numbers=array("FUNC"=>$this->FUNC_access_number, "FNOA"=>$this->FNOA_access_number, "FBUS"=>$this->FBUS_access_number, "FNOL"=>$this->FNOL_access_number ); if ($this->prepaid && $this->pstn_access) { $this->tabs['credit']=_("Credit"); } $_protocol=preg_match("/^(https?:\/\/)/",$_SERVER['SCRIPT_URI'],$m); $this->absolute_url=$m[1].$_SERVER['HTTP_HOST'].$this->url; if ($this->prepaid && $this->show_payments_tab) { $this->tabs['payments']=_("Payments"); } if ($this->show_support_tab) { $this->tabs['support'] = 'Support'; } } function initSoapClient() { dprint("initSoapClient()"); // Sip, Voicemail and Customer ports share same login $this->SOAPurl=$this->soapEngines[$this->sip_engine]['url']; $this->SOAPversion=$this->soapEngines[$this->sip_engine]['version']; if ($this->soapEngines[$this->sip_engine]['enrollment_url']) { $this->enrollment_url =$this->soapEngines[$this->sip_engine]['enrollment_url']; } if ($this->soapEngines[$this->sip_engine]['chat_replication_backend']) { $this->chat_replication_backend = $this->soapEngines[$this->sip_engine]['chat_replication_backend']; } if ($this->soapEngines[$this->sip_engine]['mongo_db']) { $this->mongo_db = $this->soapEngines[$this->sip_engine]['mongo_db']; } if ($this->soapEngines[$this->sip_engine]['sip_settings_api_url']) { $this->sip_settings_api_url =$this->soapEngines[$this->sip_engine]['sip_settings_api_url']; } if (strlen($this->loginCredentials['soapUsername'])) { $this->SOAPlogin = array( "username" => $this->loginCredentials['soapUsername'], "password" => $this->loginCredentials['soapPassword'], "admin" => false ); $this->soapUsername = $this->loginCredentials['soapUsername']; } else { $this->SOAPlogin = array( "username" => $this->soapEngines[$this->sip_engine]['username'], "password" => $this->soapEngines[$this->sip_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->soapUsername = $this->soapEngines[$this->sip_engine]['username']; } $this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); //print_r($this->SoapAuth); $this->SOAPloginAdmin = array( "username" => $this->soapEngines[$this->sip_engine]['username'], "password" => $this->soapEngines[$this->sip_engine]['password'], "admin" => true ); $this->SoapAuthAdmin = array('auth', $this->SOAPloginAdmin , 'urn:AGProjects:NGNPro', 0, ''); if (strlen($this->loginCredentials['customer_engine'])) { $this->customer_engine=$this->loginCredentials['customer_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['customer_engine'])) { $this->customer_engine=$this->soapEngines[$this->sip_engine]['customer_engine']; } else { $this->customer_engine=$this->sip_engine; } if (strlen($this->loginCredentials['voicemail_engine'])) { $this->voicemail_engine=$this->loginCredentials['voicemail_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['voicemail_engine'])) { $this->voicemail_engine=$this->soapEngines[$this->sip_engine]['voicemail_engine']; } else { $this->voicemail_engine=$this->sip_engine; } if (strlen($this->loginCredentials['enum_engine'])) { $this->enum_engine=$this->loginCredentials['enum_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['enum_engine'])) { $this->enum_engine=$this->soapEngines[$this->sip_engine]['enum_engine']; } else { $this->enum_engine=$this->sip_engine; } if (strlen($this->loginCredentials['rating_engine'])) { $this->rating_engine=$this->loginCredentials['rating_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['rating_engine'])) { $this->rating_engine=$this->soapEngines[$this->sip_engine]['rating_engine']; } else { $this->rating_engine=$this->sip_engine; } // overwrite default settings if (strlen($this->soapEngines[$this->sip_engine]['sip_proxy'])) { $this->sip_proxy = $this->soapEngines[$this->sip_engine]['sip_proxy']; } if (strlen($this->soapEngines[$this->sip_engine]['sip_outbound_proxy'])) { $this->sip_outbound_proxy = $this->soapEngines[$this->sip_engine]['sip_outbound_proxy']; } if (strlen($this->soapEngines[$this->sip_engine]['support_company'])) { $this->support_company = $this->soapEngines[$this->sip_engine]['support_company']; } if (strlen($this->soapEngines[$this->sip_engine]['support_web'])) { $this->support_web = $this->soapEngines[$this->sip_engine]['support_web']; } if (strlen($this->soapEngines[$this->sip_engine]['support_email'])) { $this->support_email = $this->soapEngines[$this->sip_engine]['support_email']; } if (strlen($this->soapEngines[$this->sip_engine]['billing_email'])) { $this->billing_email = $this->soapEngines[$this->sip_engine]['billing_email']; } if (strlen($this->soapEngines[$this->sip_engine]['sip_settings_page'])) { $this->sip_settings_page = $this->soapEngines[$this->sip_engine]['sip_settings_page']; } if (strlen($this->soapEngines[$this->sip_engine]['digest_settings_page'])) { $this->digest_settings_page = $this->soapEngines[$this->sip_engine]['digest_settings_page']; } if (strlen($this->soapEngines[$this->sip_engine]['xcap_root'])) { $this->xcap_root = $this->soapEngines[$this->sip_engine]['xcap_root']; } if (strlen($this->soapEngines[$this->sip_engine]['cdrtool_address'])) { $this->cdrtool_address = $this->soapEngines[$this->sip_engine]['cdrtool_address']; } if (strlen($this->soapEngines[$this->sip_engine]['msrp_relay'])) { $this->msrp_relay = $this->soapEngines[$this->sip_engine]['msrp_relay']; } if ($this->soapEngines[$this->sip_engine]['emergency_regions']) { $this->emergency_regions = $this->soapEngines[$this->sip_engine]['emergency_regions']; } if ($this->soapEngines[$this->sip_engine]['pstn_access']) { $this->pstn_access = $this->soapEngines[$this->sip_engine]['pstn_access']; } if ($this->soapEngines[$this->sip_engine]['call_limit']) { $this->platform_call_limit = $this->soapEngines[$this->sip_engine]['call_limit']; } if ($this->soapEngines[$this->sip_engine]['sms_access']) { $this->sms_access = $this->soapEngines[$this->sip_engine]['sms_access']; } if ($this->soapEngines[$this->sip_engine]['voicemail_server']) { $this->voicemail_server = $this->soapEngines[$this->sip_engine]['voicemail_server']; } if ($this->soapEngines[$this->sip_engine]['currency']) { $this->currency = $this->soapEngines[$this->sip_engine]['currency']; } if ($this->soapEngines[$this->sip_engine]['voicemail_access_number']) { $this->voicemail_access_number = $this->soapEngines[$this->sip_engine]['voicemail_access_number']; } if ($this->soapEngines[$this->sip_engine]['FUNC_access_number']) { $this->FUNC_access_number = $this->soapEngines[$this->sip_engine]['FUNC_access_number']; } if ($this->soapEngines[$this->sip_engine]['FNOA_access_number']) { $this->FNOA_access_number = $this->soapEngines[$this->sip_engine]['FNOA_access_number']; } if ($this->soapEngines[$this->sip_engine]['FBUS_access_number']) { $this->FBUS_access_number = $this->soapEngines[$this->sip_engine]['FBUS_access_number']; } if ($this->soapEngines[$this->sip_engine]['FNOL_access_number']) { $this->FNOL_access_number = $this->soapEngines[$this->sip_engine]['FNOL_access_number']; } if ($this->soapEngines[$this->sip_engine]['payment_processor_class']) { $this->payment_processor_class = $this->soapEngines[$this->sip_engine]['payment_processor_class']; } if ($this->soapEngines[$this->sip_engine]['change_privacy_access_number']) { $this->change_privacy_access_number = $this->soapEngines[$this->sip_engine]['change_privacy_access_number']; } if ($this->soapEngines[$this->sip_engine]['check_privacy_access_number']) { $this->check_privacy_access_number = $this->soapEngines[$this->sip_engine]['check_privacy_access_number']; } if ($this->soapEngines[$this->sip_engine]['reject_anonymous_access_number']) { $this->reject_anonymous_access_number = $this->soapEngines[$this->sip_engine]['reject_anonymous_access_number']; } if ($this->soapEngines[$this->sip_engine]['show_directory']) { $this->show_directory = $this->soapEngines[$this->sip_engine]['show_directory']; } if (isset($this->soapEngines[$this->sip_engine]['absolute_voicemail_uri'])) { $this->absolute_voicemail_uri = $this->soapEngines[$this->sip_engine]['absolute_voicemail_uri']; } if (isset($this->soapEngines[$this->sip_engine]['enable_thor'])) { $this->enable_thor=$this->soapEngines[$this->sip_engine]['enable_thor']; } if (isset($this->soapEngines[$this->sip_engine]['sip_accounts_lite'])) { $this->sip_accounts_lite=$this->soapEngines[$this->sip_engine]['sip_accounts_lite']; } if (strlen($this->soapEngines[$this->sip_engine]['timeout'])) { $this->soapTimeout=intval($this->soapEngines[$this->sip_engine]['timeout']); } if (strlen($this->soapEngines[$this->sip_engine]['store_clear_text_passwords'])) { $this->store_clear_text_passwords=$this->soapEngines[$this->sip_engine]['store_clear_text_passwords']; } if (isset($this->soapEngines[$this->sip_engine]['show_download_tab'])) { $this->show_download_tab=$this->soapEngines[$this->sip_engine]['show_download_tab']; } if (strlen($this->soapEngines[$this->sip_engine]['show_barring_tab'])) { $this->show_barring_tab=$this->soapEngines[$this->sip_engine]['show_barring_tab']; } if (isset($this->soapEngines[$this->sip_engine]['disable_extra_groups'])) { $this->disable_extra_groups=$this->soapEngines[$this->sip_engine]['disable_extra_groups']; } if (strlen($this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes'])) { //dprint($this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes']); $this->notify_on_sip_account_changes=$this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes']; } if ($this->loginCredentials['templates_path']) { $this->templates_path = $this->loginCredentials['templates_path']; } else if ($this->soapEngines[$this->sip_engine]['templates_path']) { $this->templates_path = $this->soapEngines[$this->sip_engine]['templates_path']; } // Instantiate the SOAP clients // sip $this->SipPort = new $this->soapClassSipPort($this->SOAPurl); $this->SipPort->_options['timeout'] = $this->soapTimeout; $this->SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo) { printf ("

%s at %s as %s ",$this->soapClassSipPort,$this->SOAPurl,$this->SOAPurl,$this->soapUsername); } // voicemail $this->SOAPurlVoicemail = $this->soapEngines[$this->voicemail_engine]['url']; $this->SOAPloginVoicemail = array( "username" => $this->soapEngines[$this->voicemail_engine]['username'], "password" => $this->soapEngines[$this->voicemail_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->SoapAuthVoicemail = array('auth', $this->SOAPloginVoicemail , 'urn:AGProjects:NGNPro', 0, ''); $this->VoicemailPort = new $this->soapClassVoicemailPort($this->SOAPurlVoicemail); if (strlen($this->soapEngines[$this->voicemail_engine]['timeout'])) { $this->VoicemailPort->_options['timeout'] = intval($this->soapEngines[$this->voicemail_engine]['timeout']); } else { $this->VoicemailPort->_options['timeout'] = $this->soapTimeout; } $this->VoicemailPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->VoicemailPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlVoicemail != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassVoicemailPort,$this->SOAPurlVoicemail,$this->SOAPurlVoicemail,$this->soapEngines[$this->voicemail_engine]['username']); } // enum $this->SOAPurlEnum = $this->soapEngines[$this->enum_engine]['url']; $this->SOAPloginEnum = array( "username" => $this->soapEngines[$this->enum_engine]['username'], "password" => $this->soapEngines[$this->enum_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->SoapAuthEnum = array('auth', $this->SOAPloginEnum , 'urn:AGProjects:NGNPro', 0, ''); $this->EnumPort = new $this->soapClassEnumPort($this->SOAPurlEnum); if (strlen($this->soapEngines[$this->enum_engine]['timeout'])) { $this->EnumPort->_options['timeout'] = intval($this->soapEngines[$this->enum_engine]['timeout']); } else { $this->EnumPort->_options['timeout'] = $this->soapTimeout; } $this->EnumPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->EnumPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlEnum != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassEnumPort,$this->SOAPurlEnum,$this->SOAPurlEnum,$this->soapEngines[$this->enum_engine]['username']); } // rating $this->SOAPurlRating = $this->soapEngines[$this->rating_engine]['url']; $this->SOAPloginRating = array( "username" => $this->soapEngines[$this->rating_engine]['username'], "password" => $this->soapEngines[$this->rating_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->SoapAuthRating = array('auth', $this->SOAPloginRating , 'urn:AGProjects:NGNPro', 0, ''); $this->RatingPort = new $this->soapClassRatingPort($this->SOAPurlRating); if (strlen($this->soapEngines[$this->rating_engine]['timeout'])) { $this->RatingPort->_options['timeout'] = intval($this->soapEngines[$this->rating_engine]['timeout']); } else { $this->RatingPort->_options['timeout'] = $this->soapTimeout; } $this->RatingPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->RatingPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlRating != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassRatingPort,$this->SOAPurlRating,$this->SOAPurlRating,$this->soapEngines[$this->rating_engine]['username']); } // customer $this->SOAPurlCustomer = $this->soapEngines[$this->customer_engine]['url']; $this->SOAPloginCustomer = array( "username" => $this->soapEngines[$this->customer_engine]['username'], "password" => $this->soapEngines[$this->customer_engine]['password'], "admin" => true ); $this->SoapAuthCustomer = array('auth', $this->SOAPloginCustomer , 'urn:AGProjects:NGNPro', 0, ''); $this->CustomerPort = new $this->soapClassCustomerPort($this->SOAPurlCustomer); if (strlen($this->soapEngines[$this->customer_engine]['timeout'])) { $this->CustomerPort->_options['timeout'] = intval($this->soapEngines[$this->customer_engine]['timeout']); } else { $this->CustomerPort->_options['timeout'] = $this->soapTimeout; } $this->CustomerPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->CustomerPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlCustomer != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassCustomerPort,$this->SOAPurlCustomer,$this->SOAPurlCustomer,$this->soapEngines[$this->customer_engine]['username']); } } function getMongoJournalTable() { $this->mongo_table_ro = NULL; $this->mongo_table_rw = NULL; $this->mongo_exception = 'Mongo exception'; if (is_array($this->mongo_db)) { $mongo_uri = $this->mongo_db['uri']; $mongo_replicaSet = $this->mongo_db['replicaSet']; $mongo_database = $this->mongo_db['database']; $mongo_table = $this->mongo_db['table']; try { $mongo_connection = new Mongo("mongodb://$mongo_uri", array("replicaSet" => $mongo_replicaSet)); $mongo_db = $mongo_connection->selectDB($mongo_database); $this->mongo_table_ro = $mongo_db->selectCollection($mongo_table); $this->mongo_table_ro->setSlaveOkay(true); $this->mongo_table_rw = $mongo_db->selectCollection($mongo_table); return true; } catch (MongoException $e) { $this->mongo_exception=$e->getMessage(); return false; } catch (MongoConnectionException $e) { $this->mongo_exception=$e->getMessage(); return false; } catch (Exception $e) { $this->mongo_exception=$e->getMessage(); return false; } } return false; } function getAccount($account) { dprint("getAccount($account, engine=$this->sip_engine)"); list($username,$domain)=explode("@",trim($account)); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getAccount(array("username" =>$username,"domain" =>$domain)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } //print "

";
         dprint_r($result);
         $this->owner     = $result->owner;
 
         if (!is_array($result->properties))   $result->properties=array();
         if (!is_array($result->groups))       $result->groups=array();
 
         if (!$result->quota) $result->quota=0;
 
         foreach ($result->properties as $_property) {
             $this->Preferences[$_property->name]=$_property->value;
         }
 
         //dprint_r($this->Preferences);
 
         if (!$this->Preferences['language']) {
             $this->Preferences['language'] ='en';
         }
 
         if ( $this->Preferences['blocked_by'] && !in_array("blocked",$result->groups)) {
             $this->Preferences['blocked_by']='';
         }
 
         $this->username       = $result->id->username;
         $this->domain         = $result->id->domain;
         $this->password       = $result->password;
         $this->firstName      = $result->firstName;
         $this->lastName       = $result->lastName;
         $this->rpid           = $result->rpid;
         $this->owner          = $result->owner;
         $this->timezone       = $result->timezone;
         $this->email          = $result->email;
         $this->groups         = $result->groups;
         $this->createDate     = $result->createDate;
         $this->web_password   = $this->Preferences['web_password'];
         $this->quickdial      = $result->quickdialPrefix;
         $this->timeout        = intval($result->timeout);
         $this->quota          = $result->quota;
         $this->prepaid        = intval($result->prepaid);
         $this->region         = $result->region;
 
         $this->account        = $this->username."@".$this->domain;
         $this->fullName       = $this->firstName." ".$this->lastName;
         $this->name           = $this->firstName; // used by smarty
 
         $this->yuibikey         = $result->Preferences['yubikey'];
 
         if ($this->soapEngines[$this->sip_engine]['call_limit']) {
             if ($result->callLimit) {
                 $this->callLimit   = $result->callLimit;
             } else  {
                 $this->callLimit = '';
             }
         }
 
         if ($this->soapEngines[$this->sip_engine]['ip_access_list']) {
             if (is_array($result->acl) and count($result->acl)) {
                 foreach (array_keys($result->acl) as $key) {
                     $this->ip_access_list .= sprintf("%s/%s ",$result->acl[$key]->ip, $result->acl[$key]->mask);
                 }
                 $this->ip_access_list = trim($this->ip_access_list);
             } else  {
                 $this->ip_access_list = $this->soapEngines[$this->sip_engine]['ip_access_list'];
             }
         }
 
         $this->sipId=array("username" => $this->username,
                            "domain" => $this->domain
                            );
 
         if (!$this->timeout) {
             $this->timeoutWasNotSet=1;
             $this->timeout=intval($this->FNOA_timeoutDefault);
         }
 
         if ($this->timeout > 900 ) {
             $this->timeoutWasNotSet=1;
             $this->timeout=intval(900);
         }
 
         $this->getOwnerSettings($this->owner);
 
         $this->getDomainOwner($this->domain);
 
         $this->getMobileNumber();
 
         if ($this->append_domain_to_xcap_root) {
         	$this->xcap_root     = rtrim($this->xcap_root,'/')."@".$this->domain."/";
         }
 
         $this->result    = $result;
 
     }
 
     function showAccount() {
         dprint('showAccount()');
 
         if (!$this->account) {
             print "
"; print _("Error: SIP Account information cannot be retrieved. "); return 0; print "

"; print _("You must set the Owner to enable Credit Card Payments. "); print "

"; if ($account->login_type!='subscriber') { print "

"; printf ("Daily Credit Exceeded"); } else { print _("Page Not Available"); $log=sprintf("CC transaction is not allowed from %s for %s (%s)",$_SERVER['REMOTE_ADDR'],$account->account,$this->fraud_reason); syslog(LOG_NOTICE, $log); } print "

"; print "

"; printf (_("Calling to telephone numbers is possible at the costs set forth in the Price List. "),$this->url); //printf (_("You can purchase credit with a Credit Card or Bitcoin. "),$this->url, $this->url); //print "

"; //printf (_("You can purchase credit using Bitcoin. "), $this->url); print "

"; print "

"; if ($account->login_type!='subscriber') { print "

"; printf ("%s",$this->fraud_reason); } else { print _("Page Not Available"); $log=sprintf("CC transaction is not allowed from %s for %s (%s)",$_SERVER['REMOTE_ADDR'],$account->account,$this->fraud_reason); syslog(LOG_NOTICE, $log); } print "

"; if (!in_array("payments",$this->groups)) { print "

"; print _("Credit Card payments will be activated after your identity is verified. "); } printf ("

", _("Name"), _("Document"), _("Type"), _("Size"), _("Date"), _("Last digits"), _("Mobile Number") ); if ($this->login_type != 'subscriber') { print ""; } printf (""); $this->db->next_record(); $download_url=$this->url.'&action=export_identity_proof'; printf ("", $this->db->f('name'), $download_url, $this->db->f('file_name'), $this->db->f('file_type'), number_format($this->db->f('file_size')/1024,2), $this->db->f('file_date'), $this->db->f('last_digits'), $this->db->f('mobile_number') ); if ($this->login_type != 'subscriber') { if ($_REQUEST['task'] == 'delete_identity_proof' && !$_REQUEST['confirm']){ $delete_url=$this->url.'&tab=payments&task=delete_identity_proof&confirm=1'; printf ("",$delete_url,_("Confirm")); } else { $delete_url=$this->url.'&tab=payments&task=delete_identity_proof'; printf ("",$delete_url,$this->delete_img); } } printf (""); print "
%s%s%s%s%s%s%s"; print _("Actions"); print "
%s%s %s %s KB %s%s%s%s%s

"; } else { print "
"; print "

"; print _("Credit Card payments are available only to verified customers. "); print "

"; printf (_("To become verified, upload a copy of your passport or driving license that matches the Credit Card owner. "),$this->billing_email, $this->account, $this->billing_email); print "

"; printf (_("This copy will be kept on your profile until the credit card transaction has been approved. ")); print " "; print "

url method='post' enctype='multipart/form-data'> "; print " "; print " "; print " "; if (in_array("free-pstn",$this->groups)) { print " "; } print " "; print "
"; print _("Name printed on the Credit Card"); print " "; printf ("",$_REQUEST['name']); print "
"; print _("Scanned copy of your Passport or Driver License"); print " "; printf (""); print "
"; print _("Mobile Number"); print " "; printf(" %s",$_REQUEST['mobile_number'],_("International format starting with +")); print "
"; print _("Last 4 digits on your Credit Card"); print " "; printf("",$_REQUEST['last_digits']); print "
"; print "
"; } } function exportIdentityProof() { $this->db = new DB_CDRTool(); $query=sprintf("select * from subscriber_docs where username = '%s' and domain = '%s' and document = 'identity'", addslashes($this->username), addslashes($this->domain) ); if (!$this->db->query($query)) { print ""; printf ("Error for database query: %s (%s)", $this->db->Error,$this->db->Errno); print ""; } if ($this->db->num_rows()) { $this->db->next_record(); $h=sprintf("Content-type: %s",$this->db->f('file_type')); Header($h); $h=sprintf("Content-Disposition: attachment; filename=%s",$this->db->f('file_name')); Header($h); $h=sprintf("Content-Length: %s",$this->db->f('file_size')); Header($h); $this->db->p('file_content'); } } function showIdentityTab() { $this->getEnumMappings(); $this->getAliases(); $chapter=sprintf(_("SIP Account")); $this->showChapter($chapter); print "
"; /* print " "; */ print " "; print " "; print " - + "; - if ($this->xcap_root) { + if ($this->xcap_root && !in_array("trunking", $this->groups)) { print " "; } print "
"; print _("SIP Address"); print " sip:$this->account
"; print _("Full Name"); print " $this->fullName
"; print _("Username"); print " $this->username
"; print _("Domain/Realm"); print " $this->domain
"; - if (in_array("mobile",$this->groups)) { - print _("Push Outbound Proxy"); - $ob = $this->sip_mobile_outbound_proxy; - } else { - print _("Outbound Proxy"); - $ob = $this->sip_outbound_proxy; - } + print _("Outbound Proxy"); print "$ob$this->sip_outbound_proxy
"; print _("XCAP Root"); print " $this->xcap_root
"; if ($this->pstn_access && $this->rpid) { $chapter=sprintf(_("PSTN")); $this->showChapter($chapter); print "
"; $t=0; foreach($this->enums as $e) { $t++; $rr=floor($t/2); $mod=$t-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print " "; } print "
"; print _("Caller-ID"); print " $this->rpid
"; print _("Phone Number"); print " $e
"; } + if (!in_array("trunking",$this->groups)) { $chapter=sprintf(_("Aliases")); $this->showChapter($chapter); print "
"; printf (_("You may create new aliases for incoming calls")); printf ("
"); $t=0; print "
"; foreach($this->aliases as $a) { $t++; $rr=floor($t/2); $mod=$t-$rr*2; if ($mod ==0) { $_class='even'; } else { $_class='odd'; } print "
"; } print "
"; print "
"; print '
'; print $this->hiddenElements; print "
"; + } if (!$this->isEmbedded() && $this->show_tls_section) { if ($this->enrollment_url) { include($this->enrollment_configuration); if (is_array($enrollment)) { $chapter=sprintf(_("TLS Certificate")); $this->showChapter($chapter); print " "; print _("X.509 Format"); printf (" Certificate ",$this->url); /* print " "; print _("PKCS#12 store format"); printf (" Certificate ",$this->url); */ } } } print "
"; print "
"; if ($this->email) { printf (_("Email SIP Account information to %s"),$this->email); print " "; } if ($this->sip_settings_page && $this->login_type != 'subscriber') { print "

"; printf (_("Login using SIP credentials at %s"),$this->sip_settings_page,$this->sip_settings_page); print "

"; } print $this->hiddenElements; print "
"; if($this->sip_settings_page) { $this->getbalancehistory(); if (count($this->balance_history) == "0" || $this->login_type != 'subscriber') { print "

"; print ""; $date1= new datetime($this->Preferences['account_delete_request']); $today= new datetime('now'); if ($this->Preferences['account_delete_request'] && $this->login_type != 'subscriber' ) { print "

User made a deletion request on: "; print $this->Preferences['account_delete_request']; print "

"; } if ($date1->diff($today)->d >= '2' || $this->Preferences['account_delete_request'] == '' || $this->login_type != 'subscriber' ) { print '

"; } print $this->hiddenElements; print "
"; } } function showDownloadTab() { + if (in_array("trunking",$this->groups)) { + return false; + } $chapter=sprintf(_("SIP Client download")); $this->showChapter($chapter); print " "; $this->render_download_applet(); print " "; } function showDIDTab() { if (class_exists($this->did_processor_class)) { $did_processor = new $this->did_processor_class(); } if (!$_REQUEST['ddi_action']) { $chapter=sprintf(_("Registered Numbers")); $this->showChapter($chapter); print " "; $numbers=$did_processor->getOrders($this->account); if (count($numbers)) { print ""; printf (""); foreach (array_keys($numbers) as $_number) { $t++; $rr=floor($t/2); $mod=$t-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } $form=sprintf(" "; $form.=$this->hiddenElements; $form.=sprintf ("",$_number); $form.=sprintf (""); $form.=sprintf (""); printf ("",$_number,$numbers[$_number]['country_name'],$numbers[$_number]['did_expire_date_gmt'],$numbers[$_number]['order_id'],$form); } print "
NumberCountryExpire DateOrderAction
+%s%s%s%s
%s
"; } print " "; } if ($prefixes = $did_processor->getPrefixes()) { if ($_REQUEST['ddi_action'] == 'register' && $_REQUEST['prefix'] && $_REQUEST['period']) { $chapter=sprintf(_("Register New Number")); $this->showChapter($chapter); print " "; $total=$prefixes[$_REQUEST['prefix']]['setup']+$prefixes[$_REQUEST['prefix']]['monthly']* $_REQUEST['period']; $basket = array('ddi_number' => array('price' => sprintf("%.2f",$total), 'description' => sprintf(_('Telephone Number (+%s %s) for %d months'),$_REQUEST['prefix'],$prefixes[$_REQUEST['prefix']]['country_name'],$_REQUEST['period']), 'unit' => 'number', 'duration' => 'N/A', 'qty' => 1 ) ); $this->hiddenElements=sprintf(" ", $_REQUEST['prefix'], $_REQUEST['period'] ); $data=array('customer_id' => $this->owner, 'country_iso' => $prefixes[$_REQUEST['prefix']]['country_iso'], 'city_prefix' => $prefixes[$_REQUEST['prefix']]['city_prefix'], 'period' => $_REQUEST['period'], 'map_data' => array( 'map_type' => 'URI', 'map_proto' => 'SIP', 'map_detail' => $this->account, 'map_pref_server' => 1 ), 'prepaid_funds' => "0", 'uniq_hash' => md5(mt_rand()) ); $did_processor->createOrder($data); /* if (class_exists($this->payment_processor_class)) { $payment_processor = new $this->payment_processor_class($this,$basket); } if ($payment_processor->transaction_results['success']) { if ($did_processor->createOrder($data)) { // add ENUM entry } else { // notify admin about payment without service fullfilment } } */ print " "; } else if ($_REQUEST['ddi_action'] == 'Renew' && $_REQUEST['number'] && $_REQUEST['period']) { $chapter=sprintf(_("Renew Number")); $this->showChapter($chapter); print " "; $data=array('customer_id' => $this->owner, 'did_number' => $_REQUEST['number'], 'period' => $_REQUEST['period'], 'uniq_hash' => md5(mt_rand()) ); print "Renewing number...."; $did_processor->renewOrder($data); print " "; } else if ($_REQUEST['ddi_action'] == 'Drop' && $_REQUEST['number']) { $chapter=sprintf(_("Cancel Number")); $this->showChapter($chapter); print " "; $data=array('customer_id' => $this->owner, 'did_number' => $_REQUEST['number'] ); $did_processor->cancelOrder($data); print " "; } else { $chapter=sprintf(_("Register New Number")); $this->showChapter($chapter); print " "; print "
"; print _("Select a region where you want to have a telephone number: "); print "

"; print ""; print "

"; print _("Select the duration for which you want to use the telephone number: "); print "

"; print ""; print $this->hiddenElements; print "

"; print ""; print ""; print "

"; } print " "; } else { print "

Error fetching DDI prefixes"; } print " "; } function showSupportTab() { $chapter=sprintf(_("Support")); $this->showChapter($chapter); print " "; print "

"; printf (_("To request support you may send an e-mail to %s"),$this->support_email); if ($this->support_web) { print "

"; printf (_("For more information visit %s"),$this->support_web); } print " "; } function render_download_applet() { $this->valid_os=array('nt','mac'); require("browser.php"); $os=browser_detection('os'); if ($this->create_certificate) { if ($_passport = $this->generateCertificate()) { $_account['passport'] = $_passport; } } $_account['sip_address'] = $this->account; $_account['display_name'] = sprintf("%s %s",$this->firstName,$this->lastName); $_account['password'] = $this->password; $_account['web_password'] = $this->Preferences['web_password']; $_account['email'] = $this->email; $_account['settings_url'] = $this->digest_settings_page; $_account['xcap_root'] = $this->xcap_root; $_account['outbound_proxy'] = $this->sip_proxy; if ($this->enrollment_url) { include($this->enrollment_configuration); if (is_array($enrollment)) { $_account['msrp_relay'] = $enrollment['msrp_relay']; $_account['conference_server'] = $enrollment['conference_server']; $_account['settings_url'] = $enrollment['settings_url']; if ($enrollment['ldap_hostname']) { $_account['ldap_hostname'] = $enrollment['ldap_hostname']; } if ($enrollment['ldap_dn']) { $_account['ldap_dn'] = $enrollment['ldap_dn']; } } } if ($this->store_clear_text_passwords=='false') { $match_password=false; if ($_REQUEST['password']) { $str=$this->result->id->username.":".$this->result->id->domain.":".$_REQUEST['password']; if (md5($str) == $this->result->ha1) { $_account['password']=$_REQUEST['password']; $match_password=true; } } if (!$match_password){ print "

"; print _("Please enter your SIP account password: "); if ($_REQUEST['password'] || $_REQUEST['continue']) { print "

"; } else { print "

"; } print ""; print "
"; print ""; if ($_REQUEST['password'] || $_REQUEST['continue']) { print "Entered password does not match your account"; } print "
"; print ""; print "
"; print ""; print ""; print "
"; $class='hide'; } } print "
"; if (in_array($os,$this->valid_os)) { print ""; print ""; } else { print ""; } print ""; print ""; print "
"; printf (_("Download and install %s preconfigured with your SIP account:"), $this->blink_download_url, $this->show_download_tab); print "
"; printf (" ", rand(), $this->blink_download_url, rawurlencode(json_encode($_account)) ); print "
"; print "

"; printf (_("To download %s visit %s"),$this->show_download_tab, $this->blink_download_url, $this->blink_download_url); print "

"; printf (_("If you have already installed %s, you can configure it to use your SIP account:"), $this->show_download_tab); print "
"; printf (" ", rand(), $this->show_download_tab, urlencode(json_encode($_account)) ); print "
"; print "

"; printf ("Notes. "); print _("Java Runtime Environment (JRE) must be activated in the web browser. "); print "

"; } function showFooter() { print "
"; if ($this->footerFile) { include ("$this->footerFile"); } else { print ""; } print "
"; } function showSettingsTab() { $use_yubikey=0; /* if (stream_resolve_include_path('Auth/Yubico.php')) { require_once 'Auth/Yubico.php'; $use_yubikey=1; } */ $this->getVoicemail(); print "
"; $chapter=sprintf(_("SIP Account")); $this->showChapter($chapter); if ($this->login_type != "subscriber" ) { print "
"; print "
firstName\">"; print "
"; print "
"; print "lastName\">"; print "
"; } print "
"; if ($this->login_type == 'subscriber' && in_array("deny-password-change",$this->groups)) { print _("Password can be changed only by the operator"); } else { print '"; printf ("\n\n\n\n",$this->password); } print "
"; print "
"; print '"; // print ''; print ' '; //print _("Enter text to change the password to access this web page"); print "
"; if ($use_yubikey == 1 && !$this->isEmbedded()) { print "
"; print "Yubikey id to allow SIP Account + Yubikey login to access this webpage.

The Yubikey id is the first 12 digits of the string generated by the key.

It can be set by clicking in this text field and pressing your Yubikey."); printf ("\"name=yubikey value=\"%s\">",$this->Preferences['yubikey']) ; print _("Enter Yubikey id"); print "
"; //print '
';
             //print($this->Preferences['yubikey']);
             //print_r($this);
             //print '
'; } print "
"; print "
"; print "
"; $this->showTimezones('timezone',$this->timezone); print " "; $timestamp=time(); $LocalTime=getLocalTime($this->timezone,$timestamp); print ""; print _("Local Time"); print ": $LocalTime"; //dprint_r($this->availableGroups); print "
"; if (count($this->emergency_regions) > 0) { print "
"; print ""; print "
"; } if ($this->pstn_access) { if (in_array("free-pstn",$this->groups)) { if (in_array("quota",$this->groups)) { $_class="alert alert-error"; } else { $_class=""; } if ($this->pstn_changes_allowed) { print "
"; printf ("%s
",$this->currency,$this->quota); //print "
"; if ($this->quota || in_array("quota",$this->groups)) { $this->getCallStatistics(); if ($this->thisMonth['price']) { printf (_("This month usage: %.2f %s"),$this->thisMonth['price'], $this->currency); printf (" / %d ",$this->thisMonth['calls']); print _("Calls "); } } print " "; if ($this->pstn_changes_allowed) { print ""; } print "
"; } else if ($this->quota) { print "
"; printf ("%s %s ",$this->quota,$this->currency); $this->getCallStatistics(); if ($this->thisMonth['price']) { printf (_("This month usage: %.2f %s"),$this->thisMonth['price'], $this->currency); printf (" / %d ",$this->thisMonth['calls']); print _("Calls"); } print "
"; } } if ($this->prepaid) $checked_box_prepaid="checked"; if (!$this->prepaid_changes_allowed) $disabled_box_prepaid = "disabled=true"; print "
"; } foreach (array_keys($this->availableGroups) as $key) { unset($disabled_box); if ($this->login_type == 'subscriber' && !$this->availableGroups[$key]['SubscriberMaySeeIt']) { continue; } if ($this->login_type == 'reseller' && !$this->availableGroups[$key]['ResellerMaySeeIt']) { continue; } if (in_array($key,$this->groups)) { $checked_box[$key]="checked"; } $elementName = $this->availableGroups[$key]["WEBName"]; $elementComment = $this->availableGroups[$key]["WEBComment"]; if ($this->login_type == 'subscriber') { if ($this->availableGroups[$key]['SubscriberMayEditIt']) { $disabled_box = ""; } else { $disabled_box = "disabled=true"; } } elseif ($this->login_type == 'reseller') { if ($this->availableGroups[$key]['ResellerMayEditIt']) { $disabled_box = ""; } else { $disabled_box = "disabled=true"; } } if ($key=="free-pstn" && !$this->pstn_changes_allowed) { $disabled_box = "disabled=true"; } if ($key=="blocked" && $checked_box[$key]) { $_class="alert alert-error"; $_class1="error"; } else { $_class=""; $_class1=''; } print "
"; if ($key=="blocked") { if ($this->Preferences['blocked_by']) { $selected_blocked_by[$this->Preferences['blocked_by']]='selected'; } else if ($checked_box[$key]) { $selected_blocked_by['reseller']='selected'; } if ($this->login_type == 'admin' || $this->login_type == 'reseller') { if ($this->customer != $this->reseller || $selected_blocked_by['customer']) { printf (" ", $key, $selected_blocked_by['customer'], _("Blocked by Customer"), $this->customer, $selected_blocked_by['reseller'], _("Blocked by Reseller"), $this->reseller ); } else if ($this->reseller) { printf (" ", $key, _("Active"), $selected_blocked_by['reseller'], _("Blocked by Reseller"), $this->reseller ); } else { printf (" ", $key, _("Active"), $selected_blocked_by['reseller'], _("Blocked") ); } } else if ($this->login_type == 'customer' ) { if (in_array($key,$this->groups)) { if ($this->Preferences['blocked_by'] != 'reseller') { printf (" ", $key, _("Active"), $selected_blocked_by['customer'], _("Blocked") ); } else { print _("Blocked by Reseller"); } } else { printf (" ", $key, _("Active"), $selected_blocked_by['customer'], _("Blocked") ); } } else { if (in_array($key,$this->groups)) { print _("Blocked"); } else { print _("Active"); } } + } else if ($key=="free-pstn") { if ($this->pstn_changes_allowed) { print " rpid\">"; } else { print ""; } else { print "$elementComment"; } } } else { print " "; } print "
"; } $this->showExtraGroups(); $this->showOwner(); $this->showQuickDial(); $this->showMobileNumber(); $this->showIPAccessList(); $this->showCallLimit(); print "
"); print "s",$this->timeout); print "
"; if (in_array("free-pstn",$this->groups) && !$this->show_barring_tab) { print "
"; if ($this->Preferences['show_barring_tab']){ $check_show_barring_tab="checked"; } else { $check_show_barring_tab=""; } printf ("\n",$check_show_barring_tab,_("Barring")); print "
"; } $this->showVoicemail(); $this->showBillingProfiles(); $chapter=sprintf(_("Notifications Address")); $this->showChapter($chapter); print "
email\">
"; print " "; print "
"; print "
"; print $this->hiddenElements; print " "; } function showDiversionsTab () { + if (in_array("trunking",$this->groups)) { + return false; + } $this->getVoicemail(); $this->getEnumMappings(); $this->getDivertTargets(); $this->getDiversions(); print "
"; $chapter=sprintf(_("Call Forwarding")); $this->showChapter($chapter); $this->showDiversions(); print "
"; print " "; print "
"; print $this->hiddenElements; print "
"; } function showVoicemail() { if ($this->voicemail['Account']) { $checked_voicemail="checked"; } $chapter=sprintf(_("Voice Mailbox")); $this->showChapter($chapter); print "
"; if ($this->voicemail['Account']) { print "
"; if ($this->voicemail['Options']->delete=="True") { $checked_delete_voicemail="checked"; $selected_store_voicemail['email'] ="selected"; $selected_store_voicemail['server'] =""; } else { $selected_store_voicemail['email'] =""; $selected_store_voicemail['server'] ="selected"; } if (!$this->voicemail['DisableOptions']) { print ""; } else { printf (_("Voice messages are sent by email to %s"),$this->email); } print "
"; if (!$this->voicemail['DisableOptions']) { print "
"; printf ("",$this->voicemail['Password']); print "
"; if ($this->voicemail_access_number) { print "
"; printf(_("Dial %s to listen to your messages or change preferences. "),$this->voicemail_access_number); print "
"; } } } } function showOwner() { if ($this->login_type == 'subscriber') { //print "owner\">"; return true; } print "
owner\">"; print "
"; } function showDevicesTab() { $this->getDeviceLocations(); if (count($this->locations)) { $chapter=sprintf(_("SIP Devices")); $this->showChapter($chapter); $j=0; print "
"; foreach (array_keys($this->locations) as $location) { $j++; $contact = $this->locations[$location]['contact']; $publicContact = $this->locations[$location]['publicContact']; $expires = normalizeTime($this->locations[$location]['expires']); $user_agent = $this->locations[$location]['user_agent']; $transport = $this->locations[$location]['transport']; $UAImage = $this->getImageForUserAgent($user_agent); $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print ""; print ""; print ""; } print "
"; printf ("",$this->SipUAImagesPath,$UAImage); print ""; print "$user_agent"; if ($transport == 'tls') print " "; print "
"; print _("Location"); print ""; print " "; if (strlen($transport)) print "$transport:"; print "$contact "; if ($publicContact != $contact) { print " ($publicContact) "; } if ($publicContact) { $_els=explode(":",$publicContact); if ($_loc=geoip_record_by_name($_els[0])) { $this->geo_location=$_loc['country_name'].'/'.utf8_encode($_loc['city']); } else if ($_loc=geoip_country_name_by_name($_els[0])) { $this->geo_location=$_loc; } else { $this->geo_location=''; } printf ("%s",$this->geo_location); } print "
$expires
"; } } function getBarringPrefixes() { dprint("getBarringPrefixes()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getBarringPrefixes($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->barring_prefixes=$result; return true; } function setBarringPrefixes() { dprint("setBarringPrefixes"); $prefixes=array(); $barring_prefixes=$_REQUEST['barring_prefixes']; foreach ($barring_prefixes as $_prefix) { if (preg_match("/^\+[1-9][0-9]*$/",$_prefix)) { $prefixes[]=$_prefix; } } dprint("setBarringPrefixes"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setBarringPrefixes($this->sipId,$prefixes); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } function showBarringTab() { $chapter=sprintf(_("Barred Destinations")); $this->showChapter($chapter); print "

"; print "
"; print _("You can deny outbound calls to unwanted PSTN prefixes. "); print "
"; print "
"; print "
"; print ""; print _("Example"); print ": +31900"; print "
"; if ($this->getBarringPrefixes()) { foreach ($this->barring_prefixes as $_prefix) { $found++; $rr=floor($found/2); $mod=$found-$rr*2; if ($mod == 0) { $_class='odd'; } else { $_class='even'; } print "
"; print ""; print "
"; print "
"; } } print " "; print "
"; print "
"; print $this->hiddenElements; print " "; } function saveSettings() { $this->getVoicemail(); /* $this->getEnumMappings(); $this->getDivertTargets(); $this->getDiversions(); */ $this->changedFields=array(); $this->sendCEmail=0; foreach ($this->form_elements as $el) { ${$el} = $_REQUEST[$el]; } $newACLarray = array(); $result = $this->result; if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if ($mailto && $this->email != $mailto) { $result->email=$mailto; $this->email=$mailto; $this->somethingChanged=1; $this->voicemailOptionsHaveChanged=1; $this->sendCEmail=1; array_push($this->changedFields,"Email Address"); } if ($this->login_type != "subscriber") { if ($first_name && $this->firstName != $first_name) { $result->firstName = $first_name; $this->firstName = $first_name; $this->somethingChanged=1; $this->voicemailOptionsHaveChanged=1; } if ($last_name && $this->lastName != $last_name) { $result->lastName = $last_name; $this->lastName = $last_name; $this->somethingChanged=1; } } $this->properties=$result->properties; $this->availableGroups['voicemail']=array("Group"=>"voicemail", "WEBName" =>sprintf (_("Voice Mailbox")), "SubscriberMayEditIt"=>"1", "SubscriberMaySeeIt"=>0 ); if (!$this->voicemail['Account'] && $voicemail) { if ($this->addVoicemail()) { $this->setVoicemailDiversions(); $this->createdVoicemailnow=1; } } else if ($this->voicemail['Account'] && !$voicemail) { if ($this->deleteVoicemail()) { $this->voicemail['Account']=""; $this->removeVoicemailDiversions(); } } if ($this->pstn_changes_allowed) { if (strcmp($quota,$this->quota) != 0) { if (!$quota) $quota=0; $result->quota=intval($quota); dprint ("change the quota"); $this->somethingChanged=1; } if ($quota_deblock) { $result->groups = array_unique(array_diff($this->groups,array('quota'))); $this->somethingChanged=1; $this->SipPort->addHeader($this->SoapAuth); $this->SipPort->removeFromGroup(array("username" => $this->username,"domain"=> $this->domain), "quota"); } $rpid=trim($rpid); if (strcmp($rpid,$this->rpid) != 0) { dprint ("change the rpid"); $result->rpid=$rpid; $this->somethingChanged=1; } if ($this->CallLimitChangePolicy()) { if ($this->soapEngines[$this->sip_engine]['call_limit']) { if (isset($callLimit) && $this->callLimit != $callLimit) { $result->callLimit=intval($callLimit); $this->somethingChanged=1; } } } } $owner=intval($owner); if ($owner != $this->owner && $this->login_type != 'subscriber') { dprint ("change the owner"); $result->owner=$owner; $this->somethingChanged=1; } else { $result->owner=$this->owner; } if ($this->prepaid_changes_allowed) { if(!$result->prepaid && $_REQUEST['prepaid']){ if ($result->quota) { $this->somethingChanged=1; } $this->somethingChanged=1; } else if ($result->prepaid && !$_REQUEST['prepaid']) { $this->somethingChanged=1; } $result->prepaid=intval($_REQUEST['prepaid']); } reset($this->availableGroups); foreach (array_keys($this->availableGroups) as $key) { // $val is set to 1 if web checkbox is ticked $val = $_REQUEST[$key]; if ($this->login_type != 'subscriber' || $this->availableGroups[$key]['SubscriberMayEditIt']) { if ($key == 'free-pstn') { if (in_array($key,$this->groups) && !$val) { if ($this->quota) { // we save quota for later use when pstn access is re-granted $this->somethingChanged=1; $this->setPreference('last_sip_quota',"$this->quota"); } $this->somethingChanged=1; } else if (!in_array($key,$this->groups) && $val) { if (!$this->prepaid_changes_allowed) { $this->somethingChanged=1; $result->prepaid=1; } } if (!in_array($key,$this->groups) && $val) { $this->setPreference('last_sip_quota',strval($this->quota)); $last_sip_quota=$this->Preferences['last_sip_quota']; if ($last_sip_quota) { $result->quota=intval($last_sip_quota); $this->somethingChanged=1; } } if ($this->pstn_changes_allowed) { if ($val) $newACLarray[]=trim($key); } else { if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } + } else if ($key == 'trunking') { + if ($this->login_type == 'admin' || $this->login_type == 'reseller') { + if (!$val && in_array($key,$this->groups)) { + # TODO remove diversions + } + } + if ($val) $newACLarray[]=trim($key); } else if ($key == 'blocked') { if ($this->login_type == 'admin' || $this->login_type == 'reseller') { if ($val && $val != $this->Preferences['blocked_by']) { $this->setPreference('blocked_by',$val); $this->somethingChanged=1; } else if (!$val && in_array($key,$this->groups)) { $this->somethingChanged=1; $this->setPreference('blocked_by',''); } if ($val) $newACLarray[]=trim($key); } else if ($this->login_type == 'customer' ) { if ($this->Preferences['blocked_by'] != 'reseller') { if ($val && ($val != $this->Preferences['blocked_by'] || !in_array($key,$this->groups) )) { $this->setPreference('blocked_by',$val); $this->somethingChanged=1; $newACLarray[]=trim($key); } else if (!$val && in_array($key,$this->groups)) { $this->somethingChanged=1; $this->setPreference('blocked_by',''); } if ($val) $newACLarray[]=trim($key); } else { // copy old setting if exists if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } } else if ($key == 'sms') { if ($this->sms_changes_allowed) { if (!$val && in_array($key,$this->groups)) { $this->somethingChanged=1; } else if ($val && !in_array($key,$this->groups)) { $this->somethingChanged=1; } if ($val) $newACLarray[]=trim($key); } else { // copy old setting if exists if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } else { if ($val) $newACLarray[]=trim($key); } } else { // copy old setting if exists if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } $foundGroupInAvailableGroups=array(); $extra_groups=explode(' ',$_REQUEST['extra_groups']); foreach ($extra_groups as $_grp) { if (!in_array($_grp,array_keys($this->availableGroups))) { $newACLarray[]=$_grp; } } $grantACLarray = array_unique(array_diff($newACLarray,$this->groups)); $revokeACLarray = array_unique(array_diff($this->groups,$newACLarray)); /* dprint_r($this->groups); dprint_r($newACLarray); dprint_r($grantACLarray); dprint_r($revokeACLarray); */ if (count($revokeACLarray) || count($grantACLarray)) { $result->groups=$newACLarray; $this->somethingChanged=1; } if ($language && $language != $this->Preferences['language'] ) { if ($this->login_type == 'subscriber') {; //print("Set lang $language"); $this->changeLanguage($language); } $this->setPreference("language",$language); $this->somethingChanged=1; } if ($show_barring_tab != $this->Preferences['show_barring_tab'] ) { $this->setPreference("show_barring_tab",$show_barring_tab); $this->somethingChanged=1; } if ($this->Preferences['account_delete_request'] ) { $this->setPreference("account_delete_request",date('m/d/Y h:i:s a', time())); $this->somethingChanged=1; } if ($this->login_type == 'subscriber' && in_array("deny-password-change",$this->groups)) { } else if ($sip_password) { if ($this->store_clear_text_passwords) { $result->password=$sip_password; } else { $md1=strtolower($this->username).':'.strtolower($this->domain).':'.$sip_password; $md2=strtolower($this->username).'@'.strtolower($this->domain).':'.strtolower($this->domain).':'.$sip_password; $result->password=md5($md1).':'.md5($md2); } $this->sendCEmail=1; array_push($this->changedFields,"Password"); $this->somethingChanged=1; } if ($web_password) { if ($this->store_clear_text_passwords) { $web_password_new=$web_password; } else { $md1=strtolower($this->username).':'.strtolower($this->domain).':'.$web_password; $md2=strtolower($this->username).'@'.strtolower($this->domain).':'.strtolower($this->domain).':'.$web_password; $web_password_new=md5($md1).':'.md5($md2); } $this->setPreference('web_password',$web_password_new); $this->sendCEmail=1; array_push($this->changedFields,"Web password"); $this->somethingChanged=1; } if ($web_password_reset) { $this->setPreference('web_password','remove'); $this->somethingChanged=1; } if ($this->Preferences['yubikey'] != $yubikey && !$this->isEmbedded()) { $this->setPreference('yubikey',$yubikey); $this->somethingChanged=1; } if (is_array($result->acl) and count($result->acl)) { foreach (array_keys($result->acl) as $key) { if (isset($result->acl[$key]->tag) && $result->acl[$key]->tag == '') { unset($result->acl[$key]->tag); } } } if ($this->IPAccessListChangePolicy()) { if (isset($ip_access_list) and $this->ip_access_list != $ip_access_list) { $ip_access_list=preg_replace("/\s+/","\n", trim($ip_access_list)); $list=explode("\n", trim($ip_access_list)); $ip_access_list=array(); foreach ($list as $el) { list($ip,$mask) = explode("/",$el); if ($mask <0 or $mask > 32) { continue; } if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) { continue; } $ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask)); } $result->acl=$ip_access_list; $this->somethingChanged=1; } } if (!$result->password) unset($result->password); if ($timezone && $timezone != $this->timezone) { $result->timezone=$timezone; $this->somethingChanged=1; } if ($region != $this->region) { $result->region=$region; $this->somethingChanged=1; } if (strcmp($quickdial,$this->quickdial) != 0) { $result->quickdialPrefix=$quickdial; $this->somethingChanged=1; } $mobile_number = preg_replace("/[^\+0-9]/","",$mobile_number); if ($mobile_number && !preg_match("/^\+/",$mobile_number)) { $mobile_number='+'.$mobile_number; } if ($this->Preferences['mobile_number'] != $mobile_number) { $this->setPreference('mobile_number',$mobile_number); $this->somethingChanged=1; } if (!$this->createdVoicemailnow) { // moved to its own tab //$this->setDiversions(); } if ($this->timeoutWasNotSet || $timeout != $this->timeout) { $this->somethingChanged=1; $result->timeout=intval($timeout); } if ($result->owner == '') { $this->somethingChanged=1; $result->owner=0; } if ($result->callLimit == '') { $this->somethingChanged=1; $result->callLimit=0; } if ($result->quota == '') { $this->somethingChanged=1; $result->quota=0; } if ($result->timeout == '') { $this->somethingChanged=1; $result->timeout=35; } if ($result->timeout > 900) { $this->somethingChanged=1; $result->timeout=900; } if ($this->somethingChanged) { $result->properties=$this->properties; if (!$result->quota) $result->quota=0; //dprint_r($result); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->updateAccount($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { dprint("Call updateAccount"); if ($this->sendCEmail && $this->notify_on_sip_account_changes) { $this->sendChangedEmail(False,$this->changedFields); } } } if ($this->voicemail['Account'] && !$this->createdVoicemailnow) { $delete_voicemail = $_REQUEST['delete_voicemail']; //$log=sprintf("delete_voicemail_orig=%s",$this->voicemail['Options']->delete); //dprint($log); if (($delete_voicemail && !$this->voicemail['Options']->delete) || (!$delete_voicemail && $this->voicemail['Options']->delete)) { $this->voicemail['Options']=array("delete"=>intval($delete_voicemail)); $this->voicemailOptionsHaveChanged=1; } $voicemail_password=preg_replace("/[^0-9]/","",$voicemail_password); if ($this->voicemail['Password'] != $voicemail_password) { $this->voicemailOptionsHaveChanged=1; $this->voicemail['Password']=$voicemail_password; } if ($this->voicemailOptionsHaveChanged) { $this->updateVoicemail(); } } $this->updateBillingProfiles(); } function setDiversions() { dprint ("setDiversions()"); $this->getVoicemail(); $this->getEnumMappings(); $this->getDivertTargets(); $this->getDiversions(); foreach (array_keys($this->diversionType) as $condition) { $select_name = $condition."_select"; $selectedIdx = $_REQUEST[$select_name]; $textboxURI = $_REQUEST[$condition]; if ($textboxURI && $textboxURI != "" && !preg_match("/@/",$textboxURI)) { $textboxURI=$textboxURI."@".$this->domain; } if (preg_match("/^([\+|0].*)@/",$textboxURI,$m)) { $textboxURI=$m[1]."@".$this->domain; } $uri_description = $this->divertTargets[$selectedIdx]['description']; if ($uri_description == 'Other' || $textboxURI == "") { $selectedURI = $textboxURI; } else { $selectedURI = $this->divertTargets[$selectedIdx]['value']; } $uri = $selectedURI; if (!$this->voicemail['Account'] && $uri_description == 'Voicemail') { dprint("No voicemail account found"); $uri_description='Disabled'; } if ($this->diversions[$condition]) { if ($uri_description=='Disabled' && $this->CallPrefUriType[$condition]!='Disabled') { $diversions[$condition]=""; } else if ($uri_description != 'Disabled' && $selectedURI) { if (checkURI($selectedURI)) { if ($this->CallPrefUriType[$condition]=='Disabled') { $diversions[$condition]=""; } else { if ($this->diversions[$condition] != $uri) { $diversions[$condition]=$uri; } else { $diversions[$condition]=$this->diversions[$condition]; } } } else { $diversions[$condition]=$this->diversions[$condition]; dprint("Failed to check address $selectedURI"); } } } else if ($uri_description!='Disabled' && $selectedURI) { if (checkURI($selectedURI)) { $diversions[$condition]=$uri; } else { dprint("Failed to check address $condition=\"$selectedURI\""); $diversions[$condition]=$this->diversions[$condition]; } } if (!$uri_description) $uri_description="Other"; if ($uri_description == 'Other') { $last_other=$uri; } else { $last_other = $this->CallPrefLastOther[$condition]; } $_prefLast = $condition."_lastOther"; if ($uri_description=='Other' && $this->Preferences[$_prefLast] != $last_other ) { $this->setPreference($_prefLast,$last_other); } } foreach(array_keys($this->diversions) as $key) { if ($this->diversions[$key] != $diversions[$key]) { //$log=sprintf("Diversion %s changed from %s to %s",$key,htmlentities($this->diversions[$key]),htmlentities($diversions[$key])); dprint($log); $divert_changed=1; } if ($diversions[$key]) { if ($diversions[$key] == "") { if ($this->absolute_voicemail_uri) { $diversionsSOAP[$key] = 'sip:'.$this->voicemail['Account']; } else { $diversionsSOAP[$key] = $diversions[$key]; } } else { $diversionsSOAP[$key]='sip:'.$diversions[$key]; } } else { if ($diversions[$key]) $diversionsSOAP[$key]=$diversions[$key]; } } if (!is_array($diversionsSOAP) || count($diversionsSOAP) == 0) { $diversionsSOAP=array("nocondition"=>"empty"); } if ($divert_changed) { $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$diversionsSOAP); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error2 (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $this->diversions=$diversions; } } } function setDiversion($condition,$uri) { dprint ("setDiversion($condition,$uri)"); $condition=trim($condition); $uri=trim($uri); $this->getVoicemail(); $this->getDivertTargets(); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCallDiversions($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $_uri_saved=$uri; if ($_uri_saved == "voicemail") { $uri=""; foreach ($this->divertTargets as $target) { if ($target['description'] == 'Voicemail') { $uri=$target['value']; break; } } } if ($_uri_saved == "mobile") { $uri=""; foreach ($this->divertTargets as $target) { dprint_r($target); if ($target['description'] == 'Mobile') { $uri=$target['value']; break; } } } if ($_uri_saved == "other" && $this->CallPrefLastOther[$condition]) { $uri=$this->CallPrefLastOther[$condition]; } if (strlen($uri)) { if ($uri != "") { if (!preg_match("/^(sip:|sips:)/",$uri)) $uri="sip:".$uri; } } else { $uri=NULL; } reset($this->diversionType); foreach(array_keys($this->diversionType) as $_condition) { $uri=$result->$_condition; if ($this->absolute_voicemail_uri && $uri == "") { $uri = $this->voicemail['Account']; } if (preg_match("/^(sip:|sips:)(.*)$/i",$uri,$m)) { $uri=$m[2]; } //if (!$uri) $uri=NULL; $this->diversions[$condition]=$uri; } dprint_r($this->diversions); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } function setVoicemailDiversions() { dprint ("setVoicemailDiversions()"); if ($this->getVoicemail()) { if (!$this->absolute_voicemail_uri) { $diversions['FBUS']=""; $diversions['FNOA']=""; $diversions['FNOL']=""; } else { $diversions['FBUS']="sip:".$this->voicemail['Account']; $diversions['FNOA']="sip:".$this->voicemail['Account']; $diversions['FNOL']="sip:".$this->voicemail['Account']; } $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$diversions); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } } function removeVoicemailDiversions() { dprint ("removeVoicemailDiversions()"); $this->getDiversions(); $diversions=array(); foreach (array_keys($this->diversionType) as $key) { if ($this->diversions[$key]=="" || preg_match("/voicemail_server/",$this->diversions[$key])) { $diversions_have_changed=true; } else { if ($this->diversions[$key]) { $diversions[$key]=$this->diversions[$key]; } } } if (!count($diversions)) { $diversions['nocondition']='empty'; } if ($diversions_have_changed) { $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$diversions); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } else { return true; } } function updateVoicemail() { dprint("updateVoicemail()"); $account=array("sipId" => $this->sipId, "email" => $this->email, "name" => $this->firstName.' '.$this->lastName, "password" => $this->voicemail['Password'], "options" => $this->voicemail['Options'] ); dprint_r($account); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->updateAccount($account); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); print "$error_msg\n"; printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function addVoicemail() { dprint("addVoicemail()"); $password=$this->RandomPassword(); $_account = array("sipId" => $this->sipId, "name" => $this->fullName, "password" => $password, "email" => $this->email, "options" => array("delete"=>1) ); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->addAccount($_account); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); print "$error_msg\n"; printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function deleteVoicemail() { dprint("deleteVoicemail()"); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->deleteAccount($this->sipId); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); print "$error_msg\n"; printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function setPreference($name,$value) { dprint("setPreference($name,$value)"); if (!$name) return; if (!is_array($this->properties)) { $this->properties=array(); } foreach (array_keys($this->properties) as $_key) { $_prop=$this->properties[$_key]; if ($_prop->name == $name) { if (strlen($value)) { if ($value != 'remove') { $newProperties[]=array('name'=> $name, 'value' => $value); } } $found=1; } else { $newProperties[]=$_prop; } } if (!$found) { $newProperties[]=array('name' => $name, 'value' => $value); } if ($this->properties!=$newProperties) $this->somethingChanged=1; if (!$newProperties) $newProperties = array(); $this->properties=$newProperties; //dprint_r($this->properties); } function showCreditTab() { if ($this->login_type == 'subscriber' && in_array("blocked",$this->groups)) { return false; } $task = $_REQUEST['task']; $issuer = $_REQUEST['issuer']; $prepaidCard = $_REQUEST['prepaidCard']; $prepaidId = $_REQUEST['prepaidId']; $_done = false; if ($issuer) { print " "; if ($issuer=='subscriber'){ if ($prepaidCard && $prepaidId) { if ($result = $this->addBalanceSubscriber($prepaidCard,$prepaidId)) { print "

"; printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance); print ""; $_done=true; } } } else if ($issuer=='reseller' || $issuer=='admin') { if ($_REQUEST['task'] == 'change_balance') { $description = $_REQUEST['description']; $value = $_REQUEST['value']; if (strlen($value) && $result = $this->addBalanceReseller($value,$description)) { print "

"; printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance); print ""; $_done=true; } } else if ($_REQUEST['task'] == 'refund') { $transaction = json_decode(base64_decode($_REQUEST['transaction'])); printf ("Refunding transaction id %s in value of %s", $transaction->id, $transaction->value); require('cc_processor.php'); $ccp = new CreditCardProcessor(); $refund_results = $ccp->refundPayment($transaction->id); if(count($refund_results['error']) > 0 ){ printf ("

Error %d: %s (%s)",$refund_results['error']['error_code'], $refund_results['error']['desc'], $refund_results['error']['short_message']); } else { printf ("

Transaction %s refunded with %s: %s",$transaction->id, $refund_results['success']['desc']->RefundTransactionID,$refund_results['success']['desc']->GrossRefundAmount->_value); $description=sprintf("Refund %s with %s",$transaction->id, $refund_results['success']['desc']->RefundTransactionID); if ($result = $this->addBalanceReseller(-$transaction->value,$description)) { print "

"; printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance); print ""; $_done=true; } } } } if ($_done && $_REQUEST['notify']) { $subject=sprintf ("SIP Account %s balance update",$this->account); $body="Your SIP Account balance has been updated. ". "For more details go to $this->sip_settings_page?tab=credit"; if (mail($this->email, $subject, $body, "From: $this->support_email")) { printf (_("Subscriber has been notified at %s."), $this->email); } } print " "; } $this->getPrepaidStatus(); if ($this->prepaidAccount) { $chapter=sprintf(_("Current Balance")); $this->showChapter($chapter); print "

"; print _("Your current balance is"); print ": "; printf ("%.2f %s ",$this->prepaidAccount->balance,$this->currency); print "
"; $this->showChangeBalanceReseller(); $this->showChangeBalanceSubscriber(); $this->showBalanceHistory(); } } function showChangeBalanceReseller () { if (!$this->prepaid_changes_allowed) return false; $chapter=sprintf(_("Add Balance")); $this->showChapter($chapter); print "
url method=post>
"; print " "; print ""; print " "; print "
"; $transactions = $this->getPaymentIds(); if (count($transactions)) { $chapter=sprintf(_("Refund Transaction")); $this->showChapter($chapter); print "
url method=post> "; print _("Transaction Id"); print " "; print " Notify
"; } } function showChangeBalanceSubscriber () { $this->showPrepaidVoucherForm(); } function showPrepaidVoucherForm () { if ($this->isEmbedded()) return true; $chapter=sprintf(_("Prepaid Card")); $this->showChapter($chapter); print "
"; printf (_("To add Credit to your account using a Prepaid Card enter it below. ")); print "
"; print "
url method=post>
"; print " "; print ""; if ($this->login_type != 'subscriber') { print " "; } print "
"; } function getPrepaidStatus() { dprint("getPrepaidStatus()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getPrepaidStatus(array($this->sipId)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); unset($this->prepaidAccount); return false; } else { $this->prepaidAccount=$result[0]; return true; } } function addBalanceSubscriber($prepaidCard,$prepaidId) { dprint("addBalanceSubscriberLocal($prepaidCard,$prepaidId)"); $card = array('id' => intval($prepaidId), 'number' => $prepaidCard ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addBalanceFromVoucher($this->sipId,$card); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return $result; } } function addBalanceReseller($value=0,$description='') { $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addBalance($this->sipId,floatval($value),$description); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return $result; } } function getBalanceHistory() { dprint("getBalanceHistory()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCreditHistory($this->sipId,200); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000") { printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } } $this->balance_history=$result->entries; } function getPaymentIds() { $transactions = array(); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCreditHistory($this->sipId,200); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000") { printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } } $refunded_transactions=array(); $credit_transactions=array(); foreach ($result->entries as $entry) { if (preg_match("/^CC transaction (.*)$/",$entry->description,$m)) { $credit_transactions[$m[1]]=$entry->value; } if (preg_match("/^Refund (.*) with (.*)$/",$entry->description,$m)) { $refunded_transactions[]=$m[1]; } } foreach (array_keys($credit_transactions) as $tran) { if (!in_array($tran, $refunded_transactions)) { $transactions[$tran] = $credit_transactions[$tran]; } } return $transactions; } function getTodayBalanceSummary() { $total_debit = 0; $total_credit = 0; foreach ($this->balance_history as $_line) { $value=$_line->value; if (substr($_line->date,0,10) != date("Y-m-d")) { break; } if ($value <0) { $total_debit+=$value; } if ($value >0) { $total_credit+=$value; } } $total = array('debit' => $total_debit, 'credit' => $total_credit ); return $total; } function showBalanceHistory() { $this->getBalanceHistory(); if (!count($this->balance_history)) { return; } $chapter=sprintf(_("Balance History")); $this->showChapter($chapter); print "

"; $today_summary = $this->getTodayBalanceSummary(); if ($today_summary['credit'] >= $max_credit_per_day) { print "

"; printf (_("Today's transactions: %.2f credit, %.2f debit"), $today_summary['credit'],$today_summary['debit']); } print "

"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; foreach ($this->balance_history as $_line) { if (strstr($_line->description,'Session')) { if (!$_line->value) continue; $value=$_line->value; if ($this->cdrtool_address && !$this->isEmbedded()) { $description=sprintf("$_line->description",$this->cdrtool_address,urlencode($_line->session)); } else { $description=$_line->description; } } else { $description=$_line->description; $value=$_line->value; } if ($value <0) { $total_debit+=$value; } if ($value >0) { $total_credit+=$value; } $found++; $rr=floor($found/2); $mod=$found-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print " "; printf (" ",$found, $_line->date, $_line->action, $description, number_format($value,4), number_format($_line->balance,4) ); } print " "; if (strlen($total_credit)) { printf (" ", _("Total Credit"), number_format($total_credit,4) ); } if (strlen($total_debit)) { printf (" ", _("Total Debit"), number_format($total_debit,4) ); } print "
"; print ""; print _("Date and Time"); print ""; print _("Action"); print ""; print _("Description"); print ""; print _("Value"); print ""; print _("Balance"); print "
%d %s %s %s %s %s
%s %s
%s %s
"; if ($found) { if (!$this->isEmbedded()) { print "

url&tab=credit&action=get_balance_history&csv=1 target=_new data-original-title='"; print _("Export"); print "' data-content='"; print _("Export balance history in CSV format"); print "' rel='popover' onclick=\"window.open('$this->url&tab=credit&action=get_balance_history&csv=1]')\">"; print _("Export"); print "

"; } else { print "

url&tab=credit&action=get_balance_history&csv=1 data-original-title='"; print _("Export"); print "' data-content='"; print _("Export balance history in CSV format"); print "' onclick=\"location.href='$this->url&tab=credit&action=get_balance_history&csv=1';\">"; print _("Export"); print "

"; } } print ""; } function exportBalanceHistory() { Header("Content-type: text/csv"); $h=sprintf("Content-Disposition: inline; filename=%s-prepaid-history.csv",$this->account); Header($h); print _("Id"); print ","; print _("Account"); print ","; print _("Date"); print ","; print _("Action"); print ","; print _("Description"); print ","; print _("Value"); print ","; print _("Final Balance"); print ("\n"); foreach ($this->balance_history as $_line) { if (strstr($_line->description,'Session') && !$_line->value) continue; $found++; printf ("%s,%s,%s,%s,%s,%s,%s\n", $found, $this->account, $_line->date, $_line->action, $_line->description, $_line->value, $_line->balance); } } function showDiversions($conditions=array()) { // for busy not online or unconditional foreach (array_keys($this->diversionType) as $condition) { $_prefName = $condition."_lastOther"; $this->CallPrefLastOther[$condition]= $this->Preferences[$_prefName]; } if (!count($conditions)) { $conditions=$this->diversionType; } foreach (array_keys($conditions) as $condition) { $found++; $rr=floor($found/2); $mod=$found-$rr*2; $pref_name = $conditions[$condition]; $pref_value = $this->diversions[$condition]; $select_name=$condition."_select"; $set_uri_java="set_uri_" . $condition; $update_text_java="update_text_" . $condition; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print "
"; $phoneValues = array(); foreach ($this->divertTargets as $phones) { $phoneValues[] = $phones['value']; } $lastOther = $this->CallPrefLastOther[$condition]; $otherIdx = count($this->divertTargets) - 1; $phoneValues[$otherIdx] = $lastOther; $targets = sprintf("'%s'", join("', '", $phoneValues)); print " "; print ""; if ($this->CallPrefUriType[$condition]=='Other') $style = "visible"; else $style = "hidden"; $pref_value=$this->diversions[$condition]; print " "; if ($condition=="FUNV" && $this->FUNC_access_number) { print "
"; printf (_("Dial %s2*X where X = Number of Minutes, 0 to Reset"), $this->access_numbers['FUNC']); print "
"; } print "
"; } } function showHeader() { /*print "
";*/ print "
"; if ($this->logoFile) { print "logoFile border=0>"; } print "
"; /* print "
"; */ } function chapterTableStart() { } function chapterTableStop() { } function getEnumMappings () { dprint("getEnumMappings()"); $this->enums=array(); $filter=array( 'type' => 'sip', 'mapto' => $this->account, 'owner' => intval($this->owner) ); // Range $range=array('start' => 0, 'count' => 10 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->EnumPort->addHeader($this->SoapAuthEnum); $result = $this->EnumPort->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (EnumPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach($result->numbers as $_number) { $enum='+'.$_number->id->number; $this->voicemailUsernameOptions[]=$enum; if (!in_array($enum,$this->enums)) $this->enums[]=$enum; } } function enum2tel($enum_text) { // transform enum style domain name in forward telephone number $enum_text=trim($enum_text); if (preg_match("/^\+\d+$/",$enum_text)) { return $enum_text; } $z=0; $tel_text=""; while ($z < strlen($enum_text)) { $char = substr($enum_text,$z,1); if (preg_match("/[a-zA-Z]/",$char)) { break; } else if (preg_match("/[0-9]/",$char)) { $tel_text=$char.$tel_text; $z++; } else { $z++; } } if ($tel_text) { $tel_text="+".$tel_text; return ($tel_text); } else { return $enum_text; } } function showTimezones($name,$value) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } printf (""; } function showQuickDial() { if (!preg_match("/^\d+$/",$this->username)) return 1; print "

quickdial\">"; if ($this->quickdial && preg_match("/^$this->quickdial/",$this->username)) { $dial_suffix=strlen($this->username) - strlen($this->quickdial); } printf (_("Prefix to auto-complete short numbers"),$dial_suffix); print "
"; } function showMobileNumber() { if (in_array("free-pstn",$this->groups)) { print "
%s
",$this->Preferences['mobile_number'],_("International format starting with +")); } } function CallLimitChangePolicy() { if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'customer') { return false; } if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'customer' and $this->call_limit_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'customer' and $this->call_limit_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'reseller' and $this->call_limit_may_by_changed_by == 'admin') { return false; } return true; } function IPAccessListChangePolicy() { if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'customer') { return false; } if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'customer' and $this->ip_access_list_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'customer' and $this->ip_access_list_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'reseller' and $this->ip_access_list_may_by_changed_by == 'admin') { return false; } return true; } function showIPAccessList() { if (!$this->soapEngines[$this->sip_engine]['ip_access_list']) { return; } if (!$this->IPAccessListChangePolicy()) { print "
%s
",$this->ip_access_list); } else { print "
",$this->ip_access_list); } } function showCallLimit() { if (!$this->pstn_access) { return; } if (!in_array("free-pstn",$this->groups)) { return; } if (!$this->soapEngines[$this->sip_engine]['call_limit']) { return; } $limit_text = sprintf(_("Default is %s"), $this->platform_call_limit); if (strlen($this->callLimit)) { $limit_text_ro=$this->callLimit; } else { $limit_text_ro=$this->platform_call_limit; } if (!$this->CallLimitChangePolicy()) { print "
%s
",$limit_text_ro); } else { print "
%s
",$this->callLimit, $limit_text); } } function showCallsTab() { $this->getHistory(); if ($this->calls) { $chapter=sprintf(_("Call Statistics")); $this->showChapter($chapter); $calltime=normalizeTime($this->duration); print " "; if ($this->cdrtool_address) { print "cdrtool_address target=cdrtool>"; print _("Summary"); print ""; } else { print _("Usage Data"); } print " "; printf (_("%s calls / %s / %s / %.2f %s"), $this->calls, $calltime,$this->trafficPrint,$this->price,$this->currency); print " "; print " "; print _("First / Last Call"); print " $this->firstCall / $this->lastCall "; } if ($this->enable_thor) { $cdr_source = 'sipthor'; } else { $cdr_source = 'sip_trace'; } if (count($this->calls_received)) { $chapter=sprintf(_("Incoming")); $this->showChapter($chapter); $j=0; print ""; foreach (array_keys($this->calls_received) as $call) { $j++; $uri = $this->calls_received[$call]['remoteParty']; $media=""; foreach ($this->calls_received[$call]['media'] as $m) { $media.="$m,"; } $media=quoted_printable_decode($media); $media=rtrim($media,","); $duration = normalizeTime($this->calls_received[$call]['duration']); $dialURI = $this->PhoneDialURL($uri) ; $htmlDate = $this->colorizeDate($this->calls_received[$call]['startTime']); $htmlURI = $this->htmlURI($uri); $urlURI = urlencode($this->normalizeURI($uri)); $sessionId = urlencode($this->calls_received[$call]['sessionId']); $fromTag = urlencode($this->calls_received[$call]['fromTag']); $toTag = urlencode($this->calls_received[$call]['toTag']); $proxyIP = urlencode($this->calls_received[$call]['proxyIP']); $trace_link = "Server Logs"; if (!$this->calls_received[$call]['duration']) { $htmlURI = "$htmlURI"; } $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print " "; print ""; print ""; print " "; } print "
$htmlDate $dialURI $duration $htmlURI ($media)$trace_linkurl&tab=contacts&task=add&uri=$urlURI&search_text=$urlURI>$this->phonebook_img
"; } if (count($this->calls_placed)) { $chapter=sprintf(_("Outgoing")); $this->showChapter($chapter); $j=0; print ""; foreach (array_keys($this->calls_placed) as $call) { $j++; if ($this->calls_placed[$call]['to'] == "sip:".$this->voicemail['Account'] ) { continue; } $uri = $this->calls_placed[$call]['remoteParty']; $media = ""; foreach ($this->calls_placed[$call]['media'] as $m) { $media.="$m,"; } $media=rtrim($media,","); $price = $this->calls_placed[$call]['price']; $status = $this->calls_placed[$call]['status']; $rateinfo = $this->calls_placed[$call]['rateInfo']; $duration = normalizeTime($this->calls_placed[$call]['duration']); $dialURI = $this->PhoneDialURL($uri) ; $htmlDate = $this->colorizeDate($this->calls_placed[$call]['startTime']); $stopTime = $this->calls_placed[$call]['stopTime']; $htmlURI = $this->htmlURI($uri); $urlURI = urlencode($this->normalizeURI($uri)); $sessionId = urlencode($this->calls_placed[$call]['sessionId']); $fromTag = urlencode($this->calls_placed[$call]['fromTag']); $toTag = urlencode($this->calls_placed[$call]['toTag']); $proxyIP = urlencode($this->calls_placed[$call]['proxyIP']); $trace_link = "Server Logs"; if ($price) { $price_print =sprintf(" (%s %s)",$price,$this->currency); } else { $price_print = ''; } $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } if (!$stopTime) { $duration = _('In progress'); } print " "; print ""; print ""; print " "; } print "
$htmlDate $dialURI $duration $htmlURI ($media) $price_print$trace_linkurl&tab=contacts&task=add&uri=$urlURI&search_text=$urlURI>$this->phonebook_img
"; } } function getHistory($status = 'all') { dprint("getHistory()"); $fromDate = time() - 3600 * 24 * 14; // last two weeks $toDate = time(); $CallQuery = array( "fromDate" => $fromDate, "toDate" => $toDate, "limit" => 50 ); $CallsQuery = array( "placed" => $CallQuery, "received" => $CallQuery ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCalls($this->sipId, $CallsQuery); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } // received calls foreach ($result->received as $callStructure) { $media = array(); $apps = explode(",", quoted_printable_decode($callStructure->applicationTypes[0])); foreach ($apps as $app) { $media[] = trim($app); } if (!$callStructure->stopTime && $status == 'completed') { continue; } $fromHeader = quoted_printable_decode($callStructure->fromHeader); $this->calls_received[] = array( "remoteParty" => quoted_printable_decode($callStructure->fromURI), "displayName" => getDisplayNameFromFromHeader($fromHeader), "startTime" => getLocalTime($this->timezone, $callStructure->startTime), "stopTime" => getLocalTime($this->timezone, $callStructure->stopTime), "timezone" => $this->timezone, "duration" => $callStructure->duration, "status" => $callStructure->status, "sessionId" => quoted_printable_decode($callStructure->sessionId), "fromTag" => quoted_printable_decode($callStructure->fromTag), "toTag" => quoted_printable_decode($callStructure->toTag), "proxyIP" => $callStructure->proxyIP, "media" => $media ); } // placed calls foreach ($result->placed as $callStructure) { if ($callStructure->status == 435) continue; $media = array(); $apps = explode(",", quoted_printable_decode($callStructure->applicationTypes[0])); foreach ($apps as $app) { $media[] = trim($app); } if (!$callStructure->stopTime && $status == 'completed') { continue; } $fromHeader = quoted_printable_decode($callStructure->fromHeader); $this->calls_placed[] = array( "remoteParty" => quoted_printable_decode($callStructure->toURI), "displayName" => "", "startTime" => getLocalTime($this->timezone, $callStructure->startTime), "stopTime" => getLocalTime($this->timezone, $callStructure->stopTime), "timezone" => $this->timezone, "duration" => $callStructure->duration, "status" => $callStructure->status, "price" => $callStructure->price, "sessionId" => quoted_printable_decode($callStructure->sessionId), "fromTag" => quoted_printable_decode($callStructure->fromTag), "toTag" => quoted_printable_decode($callStructure->toTag), "proxyIP" => $callStructure->proxyIP, "media" => $media ); } $this->call_history = array( 'placed' => $this->calls_placed, 'received' => $this->calls_received ); } function getCallStatistics() { dprint("getCallStatistics()"); $fromDate = mktime(0, 0, 0, date("m"), "01", date("Y")); $toDate = time(); $CallQuery = array( "fromDate" => $fromDate, "toDate" => $toDate ); $CallQuery = array( "limit" => 1 ); $CallsQuery = array( "placed" => $CallQuery ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCallStatistics($this->sipId, $CallsQuery); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } //dprint_r($result); $this->thisMonth['calls'] = $result->placed->calls; $this->thisMonth['price'] = $result->placed->price; } function addPhonebookEntry() { dprint("addPhonebookEntry()"); $uri = strtolower(trim($_REQUEST['uri'])); $name = trim($_REQUEST['name']); $group = trim($_REQUEST['group']); if (!strlen($uri)) return false; $phonebookEntry = array( 'uri' => $uri, 'name' => $name, 'group' => $group ); dprint("addPhonebookEntry"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addPhoneBookEntry($this->sipId, $phonebookEntry); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s
", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } return true; } function updatePhonebookEntry() { dprint("updatePhonebookEntry()"); $uri = strtolower(trim($_REQUEST['uri'])); $group = trim($_REQUEST['group']); $name = trim($_REQUEST['name']); $phonebookEntry = array( 'name' => $name, 'uri' => $uri, 'group' => $group ); //dprint_r($phonebookEntry); dprint("updatePhonebookEntry"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->updatePhoneBookEntry($this->sipId, $phonebookEntry); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } return true; } function deletePhonebookEntry() { dprint("deletePhonebookEntry()"); $uri = strtolower($_REQUEST['uri']); dprint("deletePhonebookEntry"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->deletePhoneBookEntry($this->sipId, $uri); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } return true; } function getPhoneBookEntries() { dprint("getPhoneBookEntries()"); if ($_REQUEST['task'] == 'search') { $search_text = trim($_REQUEST['uri']); } $group = trim($_REQUEST['group']); if (!strlen($search_text)) $search_text="%" ; $match = array( 'uri' => '%'.$search_text.'%', 'name' => '%'.$search_text.'%' ); if (strlen($group)) { if ($group == "empty") { $match['group'] = ''; } else { $match['group'] = $group; } } $range = array( 'start' => 0, 'count' => 100 ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getPhoneBookEntries($this->sipId, $match, $range); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } $this->PhonebookEntries=$result->entries; //dprint_r($this->PhonebookEntries); } function showContactsTab() { dprint("showContactsTab()"); if ($this->show_directory) { $chapter = sprintf(_("Directory")); $this->showChapter($chapter); print "

"; print _("To find other SIP Addresses fill in the First Name or the Last Name and click the Search button. "); print "
"; $this->showSearchDirectory(); print "
"; } if ($this->rows || $_REQUEST['task'] == 'directory') { // hide local contacts if we found a global contact return true; } $chapter = sprintf(_("Don't Disturb")).' '.sprintf(_("Groups")); $this->showChapter($chapter); print "
"; print _("You can organize contacts into groups that can be used to accept incoming calls in Don't Disturb section. "); print "
"; $adminonly = $_REQUEST['adminonly']; $accept = $_REQUEST['accept']; // selected search group; $task = $_REQUEST['task']; //if ($task == "search" ){ $search_text = $_REQUEST['uri']; // } $confirm = $_REQUEST['confirm']; $group = $_REQUEST['group']; $uri = $_REQUEST['uri']; $name = $_REQUEST['name']; if ($task == "deleteContact" && $confirm) { $this->deletePhonebookEntry(); unset($task); unset($confirm); } elseif ($task == "update") { $this->updatePhonebookEntry(); unset($task); } elseif ($task == "add") { $this->addPhonebookEntry(); unset($task); } $this->getPhoneBookEntries(); $maxrowsperpage = 250; $url_string = $this->url."&tab=contacts"; printf( "
", $this->url, $this->url, $this->url, _("Add sip address or search for contacts") ); if (count($this->PhonebookEntries) || $task == "search"){ $selected[$group] = "selected"; printf( " ", $selected['empty'], _("No group"), _("Search") ); } printf( "
%s
", _("Add"), _("(wildcard %)") ); if (count($this->PhonebookEntries)){ print "

"; print ""; print ""; print ""; print ""; foreach (array_keys($this->PhonebookEntries) as $_entry) { $found = $i + 1; $rr = floor($found / 2); $mod = $found - $rr * 2; if ($mod == 0) { $_class = 'odd'; } else { $_class = 'even'; } printf( " %s ", $_class, $found, $this->url, $this->tab, $this->hiddenElements, $this->tab, $this->PhonebookEntries[$_entry]->uri, $found, $this->PhonebookEntries[$_entry]->uri ); if (preg_match("/\%/", $this->PhonebookEntries[$_entry]->uri)) { print ""; if ($task == "deleteContact" && $uri == $this->PhonebookEntries[$_entry]->uri) { print ""; $i++; } print "
"; print ""; print _("SIP Address"); print ""; print ""; print ""; print _("Display Name"); print ""; print _("Group"); print ""; print _("Action"); print "
%s%s"; } else { printf( " %s ", $this->PhoneDialURL($this->PhonebookEntries[$_entry]->uri) ); } printf("
", $this->PhonebookEntries[$_entry]->name); printf("%s
", _("Update")); print "
"; printf( ""; print ""; printf( "", $url_string, urlencode($this->PhonebookEntries[$_entry]->uri), urlencode($search_text) ); print _("Confirm"); } else { print ""; printf( "", $url_string, urlencode($this->PhonebookEntries[$_entry]->uri), urlencode($search_text) ); if ($this->delete_img) { //print $this->delete_img; print ""; } else { print _("Delete"); } } print ""; print "
"; print ""; } } function exportPhonebook($userAgent) { dprint("exportPhonebook()"); $this->getPhonebookEntries(); $this->contentType = "Content-type: text/csv"; if (!is_array($this->PhonebookEntries) || !count($this->PhonebookEntries)) return true; if (!$userAgent) $userAgent = 'snom'; if ($userAgent == 'snom') { $this->export_filename = "tbook.csv"; $phonebook .= sprintf("Name,Address,Group\n"); } elseif ($userAgent == 'eyebeam') { $phonebook .= sprintf("Name,Group Name,SIP URL,Proxy ID\n"); } elseif ($userAgent == 'csco') { $this->contentType = "Content-type: text/xml"; $this->export_filename = "directory.xml"; $phonebook .= sprintf( "\n\t%s\n\tDirectory\n", $this->account ); } elseif ($userAgent == 'unidata') { $this->export_filename = "phonebook.csv"; $phonebook .= sprintf("Index,Name,,,,\n"); $phonebook .= sprintf("0,Undefined,,,,\n"); $z = 1; foreach ($this->PhonebookGroups as $_group) { $this->groupIndex[$_group] = $z; $phonebook .= sprintf("%s,%s,,,,\n", $z, $_group); $z++; } $phonebook .= sprintf("\nIndex,Name,RdNm,Tel,Group\n"); } $found = 0; foreach (array_keys($this->PhonebookEntries) as $_entry) { $fname = $this->PhonebookEntries[$_entry]->firstName; $lname = $this->PhonebookEntries[$_entry]->lastName; $uri = $this->PhonebookEntries[$_entry]->uri; $group = $this->PhonebookEntries[$_entry]->group; if (!preg_match("/[_%]/", $uri)) { $uri = substr($uri, 4); $els = explode("@", $uri); if ($els[1] == $this->domain) $uri=$els[0]; if ($userAgent == 'snom') { $phonebook .= sprintf( "%s %s,%s,%s\n", $fname, $lname, $uri, $this->PhonebookGroups[$group] ); } elseif ($userAgent == 'unidata' && $fname && $lname) { $phonebook .= sprintf( "%s,%s,%s %s,%s,%s\n", $found, $fname, $fname, $lname, $uri, $this->PhonebookGroups[$group] ); } elseif ($userAgent == 'eyebeam') { $phonebook .= sprintf( "%s %s,%s,1\n", $fname, $lname, $this->PhonebookEntries[$_entry]->uri, $this->PhonebookGroups[$group] ); } elseif ($userAgent == 'csco') { $phonebook .= sprintf( "\n\t\n\t%s %s\n\t%s\n\t\n", $fname, $lname, $uri ); } $found++ ; } } if ($userAgent == 'csco') { $phonebook .= sprintf("\n\n"); } Header($this->contentType); $_header = sprintf("Content-Disposition: inline; filename=%s", $this->export_filename); Header($_header); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Pragma: no-cache"); print $phonebook; } function getRejectMembers() { dprint("getRejectMembers()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getRejectMembers($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } $this->rejectMembers = $result; //dprint_r($this->rejectMembers); return true; } function setRejectMembers() { $members = array(); $rejectMembers = $_REQUEST['rejectMembers']; foreach ($rejectMembers as $_member) { if (strlen($_member) && !preg_match("/^sip:/", $_member)) { $_member = 'sip:'.$_member; } if (strlen($_member)) $members[] = $_member; } dprint("setRejectMembers"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setRejectMembers($this->sipId, $members); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } } function getJournalEntries() { $this->journalEntries['success'] = false; $this->journalEntries['error_message'] = NULL; $this->journalEntries['results'] = array(); $return_summary = $_REQUEST['summary']; if ($this->chat_replication_backend == 'mysql') { $this->db = new DB_CDRTool(); $where=""; if ($_REQUEST['except_uuid']) { $where.= sprintf(" and uuid <> '%s'", addslashes($_REQUEST['except_uuid'])); } if ($_REQUEST['after_id']) { $after_id = intval($_REQUEST['after_id']); } else { $after_id = 0; } $where.= sprintf(" and id > %d", addslashes($after_id)); if ($_REQUEST['after_timestamp']) { $where.= sprintf(" and timestamp > '%s'", addslashes($_REQUEST['after_timestamp'])); } if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) { $limit = intval($limit); } else { $limit = 5000; } $query=sprintf("select * from client_journal where account = '%s' %s order by timestamp ASC limit %d", addslashes($this->account), $where, $limit); if (!$this->db->query($query)) { $this->journalEntries['error_message'] = 'Database Failure'; $this->journalEntries['rows'] = 0; return false; } else { $this->journalEntries['success'] = true; $this->journalEntries['rows'] = $this->db->num_rows(); } if ($this->db->num_rows()) { while ($this->db->next_record()) { $entry = array( 'id' => $this->db->f('id'), 'source' => 'default', 'timestamp' => $this->db->f('timestamp'), 'account' => $this->db->f('account'), 'uuid' => $this->db->f('uuid'), 'ip_address' => $this->db->f('ip_address'), 'data' => $this->db->f('data') ); $this->journalEntries['results'][]=$entry; } } } else { if (!$this->getMongoJournalTable()) { $result['success'] = false; $result['error_message'] = $this->mongo_exception; return $result; } $mongo_where=array(); $mongo_where['account'] = $this->account; if ($_REQUEST['except_uuid']) { $mongo_where['uuid'] = array('$ne' => $_REQUEST['except_uuid']); } if ($_REQUEST['after_timestamp']) { $mongo_where['timestamp'] = array('$gt' => intval($_REQUEST['after_timestamp'])); } if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) { $limit = intval($limit); } else { $limit = 5000; } $cursor = $this->mongo_table_ro->find($mongo_where)->sort(array('timestamp'=>1))->limit($limit)->slaveOkay(); $this->journalEntries['success'] = true; $this->journalEntries['rows'] = $cursor->count(); foreach ($cursor as $result) { $entry = array( 'id' => strval($result['_id']), 'source' => 'default', 'timestamp' => $result['timestamp'], 'account' => $result['account'], 'uuid' => $result['uuid'], 'ip_address' => $result['ip_address'], 'data' => $result['data'] ); $this->journalEntries['results'][]=$entry; } if ($return_summary) { $mongo_where=array(); $mongo_where['account'] = $this->account; if ($_REQUEST['except_uuid']) { $mongo_where['uuid'] = array('$ne' => $_REQUEST['except_uuid']); } if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) { $limit = intval($limit); } else { $limit = 5000; } $cursor = $this->mongo_table_ro->find($mongo_where)->sort(array('timestamp'=>1))->limit($limit)->slaveOkay(); foreach ($cursor as $result) { $entry = array( 'journal_id' => strval($result['_id']), 'timestamp' => $result['timestamp'], ); $this->journalEntries['summary'][]=$entry; } } } return True; } function putJournalEntries() { $result['results'] = array(); if (strlen($_REQUEST['uuid'])) { $uuid = $_REQUEST['uuid']; } else { $result['success'] = false; $result['error_message'] = 'Missing uuid'; return $result; } if (strlen($_REQUEST['data'])) { $data = $_REQUEST['data']; } else { $result['success'] = false; $result['error_message'] = 'Missing data'; return $result; } if ($this->chat_replication_backend == 'mysql') { $this->db = new DB_CDRTool(); } else if ($this->chat_replication_backend == 'mongo') { if (!$this->getMongoJournalTable()) { $result['success'] = false; $result['error_message'] = $this->mongo_exception; return $result; } } if ($rows=json_decode($data)) { foreach ($rows as $row) { if (!property_exists($row, 'data')) { continue; } $entry = $row->data; if (property_exists($row, 'action')) { $action = $row->action; } else { $action = 'add'; } if ($this->chat_replication_backend == 'mysql') { $query=sprintf("insert into client_journal (timestamp, account, uuid, data, ip_address) values (NOW(),'%s', '%s', '%s', '%s')", addslashes($this->account), addslashes($uuid), addslashes($entry), addslashes($_SERVER['REMOTE_ADDR'])); if (!$this->db->query($query)) { $result['results'][]=array('id' => $row->id, 'journal_id' => NULL, 'source' => 'default' ); } else { $query="select LAST_INSERT_ID() as id"; $this->db->query($query); $this->db->next_record(); $id = $this->db->f('id'); $result['results'][]=array('id' => $row->id, 'journal_id' => $id, 'source' => 'default' ); } } else if ($this->chat_replication_backend == 'mongo') { if ($action == 'add') { $timestamp = time(); $mongo_query=array('timestamp' => $timestamp, 'datetime' => Date("Y-m-d H:i:s", $timestamp), 'account' => $this->account, 'uuid' => $uuid, 'data' => $entry, 'ip_address' => $_SERVER['REMOTE_ADDR'] ); $this->mongo_table_rw->insert($mongo_query); if ($mongo_query['_id']) { $mongo_id = strval($mongo_query['_id']); $result['results'][]=array('id' => $row->id, 'journal_id' => $mongo_id, 'source' => 'default' ); } else { $result['results'][]=array('id' => $row->id, 'journal_id' => NULL, 'source' => 'default' ); } } else if ($action == 'remove') { if (property_exists($row, 'journal_id')) { $mongo_query=array( 'account' => $this->account, 'journal_id' => $row->journal_id ); $this->mongo_table_rw->remove($mongo_query); $result['results'][]=array('id' => NULL, 'journal_id' => $row->journal_id ); } } } } $result['success'] = true; } else { $result['success'] = false; $result['error_message'] = 'Json decode error'; } return $result; } function deleteJournalEntries() { if (strlen($_REQUEST['data'])) { $data = $_REQUEST['data']; $entries = json_decode($data); } else { if (strlen($_REQUEST['journal_id'])) { $entries=array($_REQUEST['journal_id']); } else { $result['success'] = false; $result['error_message'] = 'Missing data'; return $result; } } if ($this->chat_replication_backend == 'mysql') { $this->db = new DB_CDRTool(); } else if ($this->chat_replication_backend == 'mongo') { if (!$this->getMongoJournalTable()) { $result['success'] = false; $result['error_message'] = $this->mongo_exception; return $result; } } if ($entries) { if ($this->chat_replication_backend == 'mysql') { $journal_id_sql=""; foreach ($entries as $entry) { $journal_id_sql.=sprintf("'%s',",$entry); } $journal_id_sql = rtrim($journal_id_sql,","); $query=sprintf("delete from client_journal where account in '%s' and journal_id in (%s)", addslashes($this->account), addslashes($journal_id_sql)); if (!$this->db->query($query)) { $result['error_message'] = 'database error'; } else { $result['success'] = true; } } else if ($this->chat_replication_backend == 'mongo') { $id_entries=array(); foreach ($entries as $entry) { $id_entries[] = new MongoId($entry); } $mongo_query=array('account' => $this->account, '_id' => array('$in'=> $id_entries) ); $this->mongo_table_rw->remove($mongo_query); $result['success'] = true; } } else { $result['success'] = false; $result['error_message'] = 'No journal entries provided'; } return $result; } function getAcceptRules() { dprint("getAcceptRules()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getAcceptRules($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach(array_keys($result->rules->persistent) as $_rule) { $_key=$result->rules->persistent[$_rule]->days; $this->acceptRules['persistent'][$_key]=array('start' =>$result->rules->persistent[$_rule]->start, 'stop' =>$result->rules->persistent[$_rule]->stop, 'groups'=>$result->rules->persistent[$_rule]->groups); } $this->acceptRules['temporary']=array('groups' => $result->rules->temporary->groups, 'duration'=> $result->rules->temporary->duration ); $this->acceptRules['groups'] = $result->nonEmptyGroups; //dprint_r($this->acceptRules); return true; } function setAcceptRules() { dprint("setAcceptRules()"); $persistentAcceptArray=array(); $temporaryAcceptArray=array(); foreach (array_keys($this->acceptDailyProfiles) as $profile) { unset($groups); $radio_persistentVarName='radio_persistent_'.$profile; $radio_persistent=$_REQUEST[$radio_persistentVarName]; if ($radio_persistent=="0") { $groups[]='everybody'; } else if ($radio_persistent=="1") { $groups[]='nobody'; } else if ($radio_persistent=="2") { $groupsVarName='groups_'.$profile; $groups=$_REQUEST[$groupsVarName]; } $startVarName='start_'.$profile; $start=$_REQUEST[$startVarName]; $stopVarName='stop_'.$profile; $stop=$_REQUEST[$stopVarName]; if (!preg_match("/^[0-2][0-9]:[0-5][0-9]$/",$start) || !preg_match("/^[0-2][0-9]:[0-5][0-9]$/",$stop) || ($start=="00:00" && $stop=="00:00") || !$start || !$stop || ($radio_persistent=="2" && (!is_array($groups) || !count($groups) )) ) { continue; } $persistentAcceptArray[]=array('start' => $start, 'stop' => $stop, 'groups' => $groups, 'days' => intval($profile) ); } // temporary $radio_temporary=$_REQUEST['radio_temporary']; unset($groups_temporary); if ($radio_temporary=="0") { $groups_temporary[]='everybody'; } else if ($radio_temporary=="1") { $groups_temporary[]='nobody'; } else if ($radio_temporary=="2") { $groups_temporary=$_REQUEST['groups_temporary']; } if (!is_array($groups_temporary)) $groups_temporary=array(); $duration=$_REQUEST['duration']; $temporaryAccept=array("groups" => $groups_temporary, "duration"=> intval($duration) ); // combine persistent and temporary $rules=array("persistent" =>$persistentAcceptArray, "temporary" =>$temporaryAccept); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setAcceptRules($this->sipId,$rules); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function showAcceptTab() { + if (in_array("trunking",$this->groups)) { + return false; + } + $chapter=sprintf(_("Do Not Disturb")); $this->showChapter($chapter); $this->getAcceptRules(); $this->getVoicemail(); $this->getDivertTargets(); $this->getDiversions(); print "

"; print "

"; print _("You can reject calls depending on the time of day and Caller-ID. "); print _("You can create custom groups in the Contacts page like Family or Coworkers. "); print "

"; print _("Rejected calls are diverted based on the Unavailable condition in the Call Forwarding page. "); print "

"; print "

"; printf (_("Your current time is: %s"),$this->timezone); $timestamp=time(); $LocalTime=getLocalTime($this->timezone,$timestamp); print " $LocalTime"; print "

"; // $chapter=sprintf(_("Rules")); // $this->showChapter($chapter); /* print "
"; print _("This will override the permanent rules for the chosen duration. "); print "
"; */ if ($this->acceptRules['temporary']['duration']) { $class_e='error'; } else { $class_e=''; } // print "
// //"; // print ""; // print _("minute(s)"); // print ""; //print "
//
//"; $chapter=sprintf(_("Rules")); $this->showChapter($chapter); print "
"; print ""; print ""; print ""; $_name="radio_temporary"; $_checked_everybody=""; $_checked_nobody=""; $_checked_groups=""; if (is_array($this->acceptRules['temporary']['groups']) &&in_array("everybody",$this->acceptRules['temporary']['groups'])) { $_checked_everybody="checked"; } else if (is_array($this->acceptRules['temporary']['groups']) && in_array("nobody",$this->acceptRules['temporary']['groups'])) { $_checked_nobody="checked"; } else if (!in_array('everybody',$this->acceptRules['temporary']['groups']) && !in_array('nobody',$this->acceptRules['temporary']['groups']) && count($this->acceptRules['temporary']['groups'])) { $_checked_groups="checked"; } if ($_checked_nobody) { $class_nobody="checked_groups"; } else { $class_nobody="note"; } printf (" ",$_name,$_checked_everybody,_("Everybody")); printf ("",$_name,$_checked_nobody,_("Nobody")); $c=count($this->acceptRules['groups']); if ($_checked_groups) { $class_groups="checked_groups"; } else { $class_groups="note"; } print ""; print " "; foreach (array_keys($this->acceptDailyProfiles) as $profile) { if ($this->acceptRules['persistent'][$profile]['start'] || $this->acceptRules['persistent'][$profile]['stop']) { $class="checked_groups"; $class2="label label-info"; } else { $class="mhj"; $class2=''; } if ($profile==1) { print ""; } print " "; unset($selected_StartTime); $selected_StartTime[$this->acceptRules['persistent'][$profile]['start']]="selected"; printf ("",$_name,$_checked_everybody,_("Everybody")); printf ("",$_name,$_checked_nobody,_("Nobody")); $c=count($this->acceptRules['groups']); if ($_checked_groups) { $class_groups="checked_groups"; } else { $class_groups="note"; } print " "; } print "
"; print _("Temporary"); print "
"; print _("Duration"); print ""; if ($this->acceptRules['temporary']['duration']) { printf (' ',$this->acceptRules['temporary']['duration']); print " acceptRules['temporary']['duration']; print "\" disabled=true>"; print " acceptRules['temporary']['duration']; print "\"> "; } else { print " "; print _("Minute(s)"); print ""; } print " %s %s "; if (count($this->acceptRules['groups'])>2) { printf ("",$_name,$_checked_groups); $i=0; foreach(array_keys($this->acceptRules['groups']) as $_group) { $i++; if (preg_match("/(everybody|nobody)/",$this->acceptRules['groups'][$_group])) continue; if (in_array($this->acceptRules['groups'][$_group],$this->acceptRules['temporary']['groups'])) { $_checked="checked"; } else { $_checked=""; } $_name="groups_temporary[]"; printf (" %s\n", $_name, $this->acceptRules['groups'][$_group], $_checked, $this->PhonebookGroups[$this->acceptRules['groups'][$_group]] ); } } print "
"; print _("Permanent"); print "
"; print _("Days"); print " "; print _("Time Interval"); print " "; print _("Groups"); print "
"; printf ("%s",$this->acceptDailyProfiles[$profile]); print ""; unset($selected_StopTime); $selected_StopTime[$this->acceptRules['persistent'][$profile]['stop']]="selected"; printf (""; $_name="radio_persistent_".$profile; $_checked_everybody=""; $_checked_nobody=""; $_checked_groups=""; if (is_array($this->acceptRules['persistent'][$profile]['groups']) && in_array("everybody",$this->acceptRules['persistent'][$profile]['groups'])) { $_checked_everybody="checked"; } else if (is_array($this->acceptRules['persistent'][$profile]['groups']) && in_array("nobody",$this->acceptRules['persistent'][$profile]['groups'])) { $_checked_nobody="checked"; } else if (!in_array('everybody',$this->acceptRules['persistent'][$profile]['groups']) && !in_array('nobody',$this->acceptRules['persistent'][$profile]['groups']) && count($this->acceptRules['persistent'][$profile]['groups'])) { $_checked_groups="checked"; } else { $_checked_everybody="checked"; } if ($_checked_nobody) { $class_nobody="checked_groups"; } else { $class_nobody="note"; } printf (" %s %s"; if (count($this->acceptRules['groups'])>2) { printf ("",$_name,$_checked_groups); $i=0; foreach(array_keys($this->acceptRules['groups']) as $_group) { $i++; if (preg_match("/(everybody|nobody)/",$this->acceptRules['groups'][$_group])) continue; if (in_array($this->acceptRules['groups'][$_group],$this->acceptRules['persistent'][$profile]['groups'])) { $_checked="checked"; } else { $_checked=""; } $_name="groups_".$profile."[]"; printf (" %s ", $_name, $this->acceptRules['groups'][$_group], $profile, $_checked, $this->PhonebookGroups[$this->acceptRules['groups'][$_group]] ); } } print "
"; print "
"; print " "; print "
"; print $this->hiddenElements; print " "; $chapter=sprintf(_("Rejected Callers")); $this->showChapter($chapter); print "
"; print "
"; print _("Use %Number@% to match PSTN numbers and user@domain to match SIP Addresses"); print "
"; if ($this->getRejectMembers()) { foreach ($this->rejectMembers as $_member) { $j++; $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print "
"; print ""; print "
"; print "
"; } } print "
"; print ""; print "
"; print "
"; print "
"; print " "; print "
"; print " "; print $this->hiddenElements; print " "; } function deleteAccount($skip_html=False) { dprint ("SipSettings->deleteAccount($this->account, $this->email)"); $this->getBalanceHistory(); if (count($this->balance_history) != "0" && $this->login_type == 'subscriber') { return false; } if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } $subject = sprintf("Removal of SIP account %s",$this->account); //$this->expire_date = new DateTime('now'); $this->expire_date = date("Y-m-d H:i:s",strtotime("+2 days")); $this->ip = $_SERVER['REMOTE_ADDR']; $tpl_html = $this->getEmailDeleteTemplateHTML($this->reseller, $this->Preferences['language']); //dprint("$tpl_html"); if (!$tpl_html && !$skip_html) { print "

"; print _("Error: no HTML email template found"); print ""; return false; } //print "$tpl_html"; define("SMARTY_DIR", "/usr/share/php/smarty/libs/"); include_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $smarty->assign('client', $this); //print"$this->sip_settings_page"; if ($tpl_html) { $bodyhtml = $smarty->fetch($tpl_html); } include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject, // 'Cc' => $this->support_email ); //dprint("1"); $crlf = "\n"; $mime = new Mail_mime($crlf); if ($tpl_html) { $mime->setHTMLBody($bodyhtml); } $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); if ($mail->send($this->email, $hdrs, $body)) { if (!$skip_html) { $this->Preferences['account_delete_request']=1; $this->saveSettings(); $this->getAccount($this->account); print "

"; printf (_("Removal email has been sent to %s"), $this->email); } return 1; } } function sendEmail($skip_html=False) { dprint ("SipSettings->sendEmail($this->email)"); $this->getVoicemail(); $this->getEnumMappings(); $this->getAliases(); $this->countAliases=count($this->aliases); if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } $subject = sprintf("SIP Account settings %s",$this->account); //if ($_REQUEST['sip_filter'] == '1') { // $identifier = $this->RandomIdentifier(); //} $tpl = $this->getEmailTemplate($this->reseller, $this->Preferences['language']); if (!$tpl && !$skip_html) { print "

"; print _("Error: no email template found"); print ""; return false; } $tpl_html = $this->getEmailTemplateHTML($this->reseller, $this->Preferences['language']); //if (!$tpl_html && !$skip_html) { // print "

"; // print _("Error: no HTML email template found"); // print ""; //} if (!$this->store_clear_text_password) { $web_password = ''; } if (in_array("free-pstn",$this->groups)) $this->allowPSTN=1; // used by smarty define("SMARTY_DIR", "/usr/share/php/smarty/libs/"); include_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $smarty->assign('client', $this); $bodyt = $smarty->fetch($tpl); if ($tpl_html) { $bodyhtml = $smarty->fetch($tpl_html); } include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setTXTBody($bodyt); if ($tpl_html) { $mime->setHTMLBody($bodyhtml); } $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); //dprint_r($_REQUEST); if ($mail->send($this->email, $hdrs, $body)) { if (!$skip_html) { print "

"; printf (_("SIP settings have been sent to %s"), $this->email); } if ($_REQUEST['password_reset'] == 'on') { $this->sendPasswordReset($skip_html); } return 1; } } function sendChangedEmail($skip_html=False, $fields=array()) { dprint ("SipSettings->sendChangedEmail($this->email)"); //dprint_r($fields); $this->ip = $_SERVER['REMOTE_ADDR']; if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } //$this->location = "Unknown"; $_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $this->location = $_loc['country_name']; } $subject = sprintf("SIP Account %s changed",$this->account); $tpl = $this->getChangedEmailTemplate($this->reseller, $this->Preferences['language']); if (!$tpl && !$skip_html) { print "

"; print _("Error: no email template found"); print ""; return false; } $tpl_html = $this->getChangedEmailTemplateHTML($this->reseller, $this->Preferences['language']); define("SMARTY_DIR", "/usr/share/php/smarty/libs/"); include_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $this->fields = $fields; $smarty->assign('client', $this); $bodyt = $smarty->fetch($tpl); if ($tpl_html) { $bodyhtml = $smarty->fetch($tpl_html); } include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setTXTBody($bodyt); if ($tpl_html) { $mime->setHTMLBody($bodyhtml); } $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); //dprint_r($_REQUEST); if ($mail->send($this->email, $hdrs, $body)) { return 1; } } function sendRemoveAccount() { $this->ip = $_SERVER['REMOTE_ADDR']; $subject=sprintf ("The account %s was removed from IP Address: %s",$this->account, $this->ip); syslog(LOG_NOTICE, $subject); } function sendPasswordReset($skip_html=False) { dprint ("SipSettings->sendPasswordEmail($this->email)"); $identifier = RandomIdentifier(); $this->db = new DB_CDRTool(); $this->ip = $_SERVER['REMOTE_ADDR']; $insert_data = array ( 'sip_account' => $this->account, 'email' => $this->email, 'ip' => $this->ip ); $this->expire=date("Y-m-d H:i:s",strtotime("+30 minutes")); $query=sprintf("insert into memcache set `key`='email_%s', `value`='%s', `expire`='%s'", $identifier, json_encode($insert_data), $this->expire ); $this->db->query($query); $this->identifier = $identifier; dprint("$query
Identifier: $identifier"); if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } $subject = sprintf("Password reset for %s",$this->account); $tpl_html = $this->getEmailPasswordTemplateHTML($this->reseller, $this->Preferences['language']); define("SMARTY_DIR", "/usr/share/php/smarty/libs/"); include_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $smarty->assign('client', $this); $bodyhtml = $smarty->fetch($tpl_html); include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setHTMLBody($bodyhtml); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); //dprint_r($_REQUEST); if ($mail->send($this->email, $hdrs, $body) && !$skip_html) { print "

  • "; printf (_("Password reset has been sent to %s"), $this->email); print "
  • "; } return 1; } function checkSettings() { dprint ("checkSettings()"); foreach ($this->form_elements as $el) { ${$el}=trim($_REQUEST[$el]); } if ($accept_temporary_remain && !is_numeric($accept_temporary_remain)) { $this->error=_("Invalid Expiration Period"); return false; } if ($quota && !is_numeric($quota) && !is_float($quota)) { $this->error=_("Invalid Quota"); return false; } if (!$timezone && !$this->timezone) { $this->error=_("Missing Timezone"); return false; } if (!$this->checkEmail($mailto)) { $this->error=_("Invalid E-mail Address"); return false; } $rpid=preg_replace("/[^0-9\x]/","",$rpid); if (preg_match("/^0+([1-9]\d*)$/",$rpid,$m)) $rpid=$m[1]; $quickdial=preg_replace("/[^0-9]/","",$quickdial); if (!strlen($accept_temporary_group)) $accept_temporary_remain=0; if (!$accept_temporary_remain) $accept_temporary_group=""; if (!$anonymous) $anonymous="0"; return true; } function RandomPassword($len=6) { $alf=array("1","2","3","4","5","6","7","8","9"); $i=0; while($i < $len) { srand((double)microtime(true)*1000000); $randval = rand(0,8); $string="$string"."$alf[$randval]"; $i++; } return $string; } function cleanURI($uri) { $uri=preg_replace("/.*sips?:([^;><=]+).*/", "\$1", $uri); return urlencode($uri); } function showUpgradeTab () { } function PhoneDialURL($uri) { $uri=$this->normalizeURI($uri); if (!preg_match("/^sip:/",$uri)) { $uri="sip:".$uri; } $uri_print="$this->call_img"; return $uri_print; } function showChapter($chapter) { print "

    "; print $chapter; print "

    "; } function normalizeURI($uri) { $uri=quoted_printable_decode($uri); $uri=preg_replace("/.*(sips?:[^;><=]+).*/", "\$1", $uri); if (preg_match("/^(sips?:.*):/", $uri, $m)) $uri=$m[1]; if (preg_match("/^(.*sips?:0\d+)@(.*)(>?)$/",$uri,$m)) { $uri=$m[1]."@".$this->domain.$m[3]; } return $uri; } function htmlURI($uri) { if (preg_match("/^sips?:00(\d+)@/",$uri,$m)) { $uri="+".$m[1]; } return htmlentities($uri); } function colorizeDate($call_date) { list($date,$time)=explode(" ",$call_date); if ($date== Date("Y-m-d",time())) { $datePrint="".sprintf(_("Today"))." ".$time; } else if ($date== Date("Y-m-d",time()-3600*24)) { $datePrint="".sprintf(_("Yesterday"))." ".$time; } else { $datePrint=$call_date; } return $datePrint; } function checkEmail($email) { dprint ("checkEmail($email)"); $regexp = "/^([a-z0-9][a-z0-9_.-]*)@([a-z0-9][a-z0-9-]*\.)+([a-z]{2,})$/i"; if (stristr($email,"-.") || !preg_match($regexp, $email)) { return false; } return true; } function getFileTemplate($name, $type="file") { dprint("getFileTemplate(name=$name, type=$type, path=$this->templates_path)"); if ($type=='logo') { $extensions=array('png','gif','jpg'); foreach ($extensions as $_ext) { $file=$this->templates_path.'/'.$this->reseller.'/'.$name.'.'.$_ext; if (file_exists($file)) { return $file; } } foreach ($extensions as $_ext) { if (file_exists("$this->templates_path/default/$name.$_ext")) { return "$this->templates_path/default/$name.$_ext"; } } return false; } else { if (file_exists("$this->templates_path/$this->reseller/$name")) { return "$this->templates_path/$this->reseller/$name"; } elseif (file_exists("$this->templates_path/default/$name")) { return "$this->templates_path/default/$name"; } else { return false; } } } function getEmailTemplate($reseller, $language='en') { $file = "sip_settings_email_$language.tpl"; $file2 = "sip_settings_email.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getEmailTemplateHTML($reseller, $language='en') { $file = "sip_settings_email_$language.html.tpl"; $file2 = "sip_settings_email.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getChangedEmailTemplate($reseller, $language='en') { $file = "sip_settings_changed_$language.tpl"; $file2 = "sip_settings_changed.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getChangedEmailTemplateHTML($reseller, $language='en') { $file = "sip_settings_changed_$language.html.tpl"; $file2 = "sip_settings_changed.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getEmailPasswordTemplateHTML($reseller, $language='en') { $file = "password_reminder_$language.html.tpl"; $file2 = "password_reminder.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getEmailDeleteTemplateHTML($reseller, $language='en') { $file = "delete_$language.html.tpl"; $file2 = "delete.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getBillingProfiles() { dprint("getBillingProfiles()"); // Get getBillingProfiles $this->RatingPort->addHeader($this->SoapAuthRating); $result = $this->RatingPort->getEntityProfiles("subscriber://".$this->account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } $this->billingProfiles=$result; } function showBillingProfiles() { if ($this->login_type != 'reseller' && $this->login_type != 'admin') { return false; } if (!$this->pstn_changes_allowed) { return false; } $this->getBillingProfiles(); $chapter=sprintf(_("Billing Profiles")); $this->showChapter($chapter); print "

    / ", $this->billingProfiles->profileWeekday, $this->billingProfiles->profileWeekdayAlt ); print "
    "; print "
    / ", $this->billingProfiles->profileWeekend, $this->billingProfiles->profileWeekendAlt ); print "
    "; print "
    "); if ($this->billingProfiles->timezone) { $_timezone=$this->billingProfiles->timezone; } else { $_timezone=$this->resellerProperties['timezone']; } $this->showTimezones('profileTimezone',$_timezone); print "
    "; } function updateBillingProfiles() { if ($this->login_type != 'reseller' && $this->login_type != 'admin') { return false; } if (!$this->pstn_changes_allowed) { return true; } $this->RatingPort->addHeader($this->SoapAuthRating); $result = $this->RatingPort->getEntityProfiles("subscriber://".$this->account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } $this->billingProfiles=$result; $profiles=array("entity" =>'subscriber://'.$this->account , "profileWeekday" => trim($_REQUEST['profileWeekday']), "profileWeekdayAlt" => trim($_REQUEST['profileWeekdayAlt']), "profileWeekend" => trim($_REQUEST['profileWeekend']), "profileWeekendAlt" => trim($_REQUEST['profileWeekendAlt']), "timezone" => trim($_REQUEST['profileTimezone']) ); //print_r($profiles); $this->RatingPort->addHeader($this->SoapAuthRating); if ($this->billingProfiles->profileWeekday && !$profiles['profileWeekday']) { // delete profile $result = $this->RatingPort->deleteEntityProfiles('subscriber://'.$this->account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } } else if ($profiles['profileWeekday']) { // update profile $result = $this->RatingPort->setEntityProfiles($profiles); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } } } function getImageForUserAgent($agent) { // array with mappings between User Agents and images foreach ($this->userAgentImages as $agentRegexp => $image) { if (preg_match("/$agentRegexp/i", $agent)) { return $image; } } return "unknown.png"; } function showExtraGroups () { if ($this->disable_extra_groups) return true; $foundGroupInAvailableGroups=array(); foreach ($this->groups as $_grp) { foreach (array_keys($this->availableGroups) as $a_grp) { if ($_grp == $a_grp) $foundGroupInAvailableGroups[]=$_grp; continue; } } $extraGroups = array_unique(array_diff($this->groups,$foundGroupInAvailableGroups)); foreach ($extraGroups as $_eg) { $extraGroups_text.=$_eg.' '; } if ($this->login_type == 'subscriber') { printf ("",trim($extraGroups_text)); } else { print "

    "; printf ("",trim($extraGroups_text)); print "
    "; } } function generateCertificate() { global $enrollment; include("/etc/cdrtool/enrollment/config.ini"); if (!is_array($enrollment)) { print _("Error: missing enrollment settings"); return false; } if (!$enrollment['ca_conf']) { //print _("Error: missing enrollment ca_conf settings"); return false; } if (!$this->owner) { return false; } if (!$enrollment['ca_crt']) { //print _("Error: missing enrollment ca_crt settings"); return false; } if (!$enrollment['ca_key']) { //print _("Error: missing enrollment ca_key settings"); return false; } $config = array( 'config' => $enrollment['ca_conf'], 'digest_alg' => 'md5', 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => false, ); $dn = array( "countryName" => "NL", "stateOrProvinceName" => "Noord Holland", "localityName" => "Haarlem", "organizationName" => "AG Projects", "organizationalUnitName" => "Blink", "commonName" => $this->owner, "emailAddress" => $this->email ); $this->key = openssl_pkey_new($config); if ($this->key==FALSE) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } $this->csr = openssl_csr_new($dn, $this->key); if (!$this->csr) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } $ca="file://".$enrollment['ca_crt']; $this->crt = openssl_csr_sign($this->csr, $ca, $enrollment['ca_key'], 3650, $config); if ($this->crt==FALSE) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } openssl_csr_export ($this->csr, $this->csr_out); openssl_pkey_export ($this->key, $this->key_out, $this->password, $config); openssl_x509_export ($this->crt, $this->crt_out); openssl_pkcs12_export ($this->crt, $this->p12_out, $this->key, $this->password); $ret=array( 'csr' => $this->csr_out, 'crt' => $this->crt_out, 'key' => $this->key_out, 'pkey'=> $public_key, 'p12' => $this->p12_out, 'ca' => file_get_contents($enrollment['ca_crt']) ); return $ret; } function exportCertificateX509() { if (!$this->owner) return; Header("Content-type: application/x-crt"); $header=sprintf("Content-Disposition: inline; filename=sipthor-owner-certificate-%s.crt",$this->owner); Header($header); $cert=$this->generateCertificate(); $crt=$cert['crt'].$cert['key']; print $crt; } function exportCertificateP12() { if (!$this->owner) return; $cert=$this->generateCertificate(); Header("Content-type: application/x-p12"); $header=sprintf("Content-Disposition: inline; filename=sipthor-owner-certificate-%s.p12",$this->owner); Header($header); print $cert['p12']; } function isEmbedded() { // return true if page was loaded from non-session based web session if ($_SERVER['SSL_CLIENT_CERT'] || $_SERVER['PHP_AUTH_DIGEST']) { return true; } return false; } function changeLanguage($lang='en',$domain='cdrtool') { // run dpkg-reconfigure locales and select support languages .utf8 $lang = $this->languageCodeFor(isset($lang) ? $lang : 'en'); $lang.='.utf8'; setlocale(LC_ALL, $lang); bindtextdomain($domain, '/var/www/CDRTool/po/locale'); bind_textdomain_codeset($domain,'UTF-8'); textdomain($domain); } // return full language code for given 2 letter language code function languageCodeFor($lang='en') { $lang = isset($lang) ? strtolower($lang) : 'en'; switch ($lang) { case 'en': return 'en_US'; // this can be C or en_US case 'ja': return 'ja_JP'; default : return ($lang . '_' . strtoupper($lang)); } return 'C'; // this will never be reached } function showDirectorySearchForm () { + if (in_array("trunking",$this->groups)) { + return false; + } print "
    url method=post> "; print $this->hiddenElements; print "
    "; print " ",$_REQUEST['firstname']); print "
    "; print "",$_REQUEST['lastname']); print ""; print "
    "; } function showSearchDirectory() { if (!$this->show_directory) { return false; } $this->maxrowsperpage=20; $this->showDirectorySearchForm(); if ($_REQUEST['firstname'] || $_REQUEST['lastname']) { if ($_REQUEST['firstname'] && strlen($_REQUEST['firstname']) < 3) { return false; } if ($_REQUEST['lastname'] && strlen($_REQUEST['lastname']) < 3) { return false; } } else { return false; } $this->next = $_REQUEST['next']; // Filter $filter=array('firstName'=> trim($_REQUEST['firstname']), 'lastName' => trim($_REQUEST['lastname']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SipPort->addHeader($this->SoapAuthAdmin); // Call function $result = $this->SipPort->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->rows = $result->total; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } if ($this->rows) { print "

    "; printf(_("%s contacts found. "),$this->rows); if ($this->isEmbedded()) { //printf (_("Click on %s to add a Contact to Blink. "),$this->plus_sign_img); } print "
    "; print ""; print ""; print ""; print ""; print " "; $i=0; while ($i < $maxrows) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $index=$this->next+$i+1; $rr=floor($index/2); $mod=$index-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } $i++; $name=$account->firstName.' '.$account->lastName; $sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain); $contacts_url=sprintf("%s",$this->url,$sip_account,urlencode($name),$sip_account,$this->phonebook_img); if ($this->isEmbedded()) { //$add_contact_url=sprintf("%s",$sip_account,$name,$this->plus_sign_img); printf ("", $_class, $index, $name, $sip_account, $account->timezone, $this->PhoneDialURL($sip_account), $add_contact_url ); } else { printf ("", $_class, $index, $name, $sip_account, $account->timezone, $this->PhoneDialURL($sip_account), $contacts_url ); } } print "
    "; print _('Display Name'); print ""; print _('SIP Address'); print ""; print _('Timezone'); print ""; print _('Action'); print "
    %d%s%s%s%s %s
    %d%s%s%s%s %s
    "; $this->showPagination($maxrows); return true; } } function showPagination($maxrows) { $url = sprintf("%s&tab=%s&firstname=%s&lastname%s", $this->url, $this->tab, urlencode($_REQUEST['firstname']), urlencode($_REQUEST['lastname']) ); print "

    "; if ($this->next != 0 ) { $show_next=$this->maxrowsperpage-$this->next; if ($show_next < 0) { $mod_show_next = $show_next-2*$show_next; } if (!$mod_show_next) $mod_show_next=0; if ($mod_show_next/$this->maxrowsperpage >= 1) { printf ("Begin ",$url); } printf ("Previous ",$url,$mod_show_next); } print " "; if ($this->next + $this->maxrowsperpage < $this->rows) { $show_next = $this->maxrowsperpage + $this->next; printf ("Next ",$url,$show_next); } print "
    "; } } function lookupGeoLocation($ip) { if ($_loc=geoip_record_by_name($ip)) { $_loc['timezone'] = get_time_zone($_loc['country_code'], $_loc['region']); $_loc['region'] = get_region($_loc['country_code'], $_loc['region']); $country_transition = array( "A1" => "N/A", "A2" => "N/A", "O1" => "N/A", "AP" => "N/A", "GB" => "UK"); if (array_key_exists($_loc['country_code'],$country_transition)) { $_loc['country_code'] = $country_transition[$_loc['country_code']]; } return $_loc; } else { return array(); } } function get_region($country, $region) { if ($country == "US" || $country =="CA" ) { $full_region = $region; // If region can't be found make it a default region to prevent NGNpro error if ($full_region == '' && $country == "US") { $full_region = "NY"; } else if ($full_region == '' && $country == "CA") { $full_region = "QC"; } } else { $full_region=''; } return $full_region; } function get_time_zone($country, $region) { switch ($country) { case "US": switch ($region) { case "AL": $timezone = "America/Chicago"; break; case "AK": $timezone = "America/Anchorage"; break; case "AZ": $timezone = "America/Phoenix"; break; case "AR": $timezone = "America/Chicago"; break; case "CA": $timezone = "America/Los_Angeles"; break; case "CO": $timezone = "America/Denver"; break; case "CT": $timezone = "America/New_York"; break; case "DE": $timezone = "America/New_York"; break; case "DC": $timezone = "America/New_York"; break; case "FL": $timezone = "America/New_York"; break; case "GA": $timezone = "America/New_York"; break; case "HI": $timezone = "Pacific/Honolulu"; break; case "ID": $timezone = "America/Denver"; break; case "IL": $timezone = "America/Chicago"; break; case "IN": $timezone = "America/Indianapolis"; break; case "IA": $timezone = "America/Chicago"; break; case "KS": $timezone = "America/Chicago"; break; case "KY": $timezone = "America/New_York"; break; case "LA": $timezone = "America/Chicago"; break; case "ME": $timezone = "America/New_York"; break; case "MD": $timezone = "America/New_York"; break; case "MA": $timezone = "America/New_York"; break; case "MI": $timezone = "America/New_York"; break; case "MN": $timezone = "America/Chicago"; break; case "MS": $timezone = "America/Chicago"; break; case "MO": $timezone = "America/Chicago"; break; case "MT": $timezone = "America/Denver"; break; case "NE": $timezone = "America/Chicago"; break; case "NV": $timezone = "America/Los_Angeles"; break; case "NH": $timezone = "America/New_York"; break; case "NJ": $timezone = "America/New_York"; break; case "NM": $timezone = "America/Denver"; break; case "NY": $timezone = "America/New_York"; break; case "NC": $timezone = "America/New_York"; break; case "ND": $timezone = "America/Chicago"; break; case "OH": $timezone = "America/New_York"; break; case "OK": $timezone = "America/Chicago"; break; case "OR": $timezone = "America/Los_Angeles"; break; case "PA": $timezone = "America/New_York"; break; case "RI": $timezone = "America/New_York"; break; case "SC": $timezone = "America/New_York"; break; case "SD": $timezone = "America/Chicago"; break; case "TN": $timezone = "America/Chicago"; break; case "TX": $timezone = "America/Chicago"; break; case "UT": $timezone = "America/Denver"; break; case "VT": $timezone = "America/New_York"; break; case "VA": $timezone = "America/New_York"; break; case "WA": $timezone = "America/Los_Angeles"; break; case "WV": $timezone = "America/New_York"; break; case "WI": $timezone = "America/Chicago"; break; case "WY": $timezone = "America/Denver"; break; } break; case "CA": switch ($region) { case "AB": $timezone = "America/Edmonton"; break; case "BC": $timezone = "America/Vancouver"; break; case "MB": $timezone = "America/Winnipeg"; break; case "NB": $timezone = "America/Halifax"; break; case "NL": $timezone = "America/St_Johns"; break; case "NT": $timezone = "America/Yellowknife"; break; case "NS": $timezone = "America/Halifax"; break; case "NU": $timezone = "America/Rankin_Inlet"; break; case "ON": $timezone = "America/Rainy_River"; break; case "PE": $timezone = "America/Halifax"; break; case "QC": $timezone = "America/Montreal"; break; case "SK": $timezone = "America/Regina"; break; case "YT": $timezone = "America/Whitehorse"; break; } break; case "AU": switch ($region) { case "01": $timezone = "Australia/Canberra"; break; case "02": $timezone = "Australia/NSW"; break; case "03": $timezone = "Australia/North"; break; case "04": $timezone = "Australia/Queensland"; break; case "05": $timezone = "Australia/South"; break; case "06": $timezone = "Australia/Tasmania"; break; case "07": $timezone = "Australia/Victoria"; break; case "08": $timezone = "Australia/West"; break; } break; case "AS": $timezone = "US/Samoa"; break; case "CI": $timezone = "Africa/Abidjan"; break; case "GH": $timezone = "Africa/Accra"; break; case "DZ": $timezone = "Africa/Algiers"; break; case "ER": $timezone = "Africa/Asmera"; break; case "ML": $timezone = "Africa/Bamako"; break; case "CF": $timezone = "Africa/Bangui"; break; case "GM": $timezone = "Africa/Banjul"; break; case "GW": $timezone = "Africa/Bissau"; break; case "CG": $timezone = "Africa/Brazzaville"; break; case "BI": $timezone = "Africa/Bujumbura"; break; case "EG": $timezone = "Africa/Cairo"; break; case "MA": $timezone = "Africa/Casablanca"; break; case "GN": $timezone = "Africa/Conakry"; break; case "SN": $timezone = "Africa/Dakar"; break; case "DJ": $timezone = "Africa/Djibouti"; break; case "SL": $timezone = "Africa/Freetown"; break; case "BW": $timezone = "Africa/Gaborone"; break; case "ZW": $timezone = "Africa/Harare"; break; case "ZA": $timezone = "Africa/Johannesburg"; break; case "UG": $timezone = "Africa/Kampala"; break; case "SD": $timezone = "Africa/Khartoum"; break; case "RW": $timezone = "Africa/Kigali"; break; case "NG": $timezone = "Africa/Lagos"; break; case "GA": $timezone = "Africa/Libreville"; break; case "TG": $timezone = "Africa/Lome"; break; case "AO": $timezone = "Africa/Luanda"; break; case "ZM": $timezone = "Africa/Lusaka"; break; case "GQ": $timezone = "Africa/Malabo"; break; case "MZ": $timezone = "Africa/Maputo"; break; case "LS": $timezone = "Africa/Maseru"; break; case "SZ": $timezone = "Africa/Mbabane"; break; case "SO": $timezone = "Africa/Mogadishu"; break; case "LR": $timezone = "Africa/Monrovia"; break; case "KE": $timezone = "Africa/Nairobi"; break; case "TD": $timezone = "Africa/Ndjamena"; break; case "NE": $timezone = "Africa/Niamey"; break; case "MR": $timezone = "Africa/Nouakchott"; break; case "BF": $timezone = "Africa/Ouagadougou"; break; case "ST": $timezone = "Africa/Sao_Tome"; break; case "LY": $timezone = "Africa/Tripoli"; break; case "TN": $timezone = "Africa/Tunis"; break; case "AI": $timezone = "America/Anguilla"; break; case "AG": $timezone = "America/Antigua"; break; case "AW": $timezone = "America/Aruba"; break; case "BB": $timezone = "America/Barbados"; break; case "BZ": $timezone = "America/Belize"; break; case "CO": $timezone = "America/Bogota"; break; case "VE": $timezone = "America/Caracas"; break; case "KY": $timezone = "America/Cayman"; break; case "CR": $timezone = "America/Costa_Rica"; break; case "DM": $timezone = "America/Dominica"; break; case "SV": $timezone = "America/El_Salvador"; break; case "GD": $timezone = "America/Grenada"; break; case "FR": $timezone = "Europe/Paris"; break; case "GP": $timezone = "America/Guadeloupe"; break; case "GT": $timezone = "America/Guatemala"; break; case "GY": $timezone = "America/Guyana"; break; case "CU": $timezone = "America/Havana"; break; case "JM": $timezone = "America/Jamaica"; break; case "BO": $timezone = "America/La_Paz"; break; case "PE": $timezone = "America/Lima"; break; case "NI": $timezone = "America/Managua"; break; case "MQ": $timezone = "America/Martinique"; break; case "UY": $timezone = "America/Montevideo"; break; case "MS": $timezone = "America/Montserrat"; break; case "BS": $timezone = "America/Nassau"; break; case "PA": $timezone = "America/Panama"; break; case "SR": $timezone = "America/Paramaribo"; break; case "PR": $timezone = "America/Puerto_Rico"; break; case "KN": $timezone = "America/St_Kitts"; break; case "LC": $timezone = "America/St_Lucia"; break; case "VC": $timezone = "America/St_Vincent"; break; case "HN": $timezone = "America/Tegucigalpa"; break; case "YE": $timezone = "Asia/Aden"; break; case "JO": $timezone = "Asia/Amman"; break; case "TM": $timezone = "Asia/Ashgabat"; break; case "IQ": $timezone = "Asia/Baghdad"; break; case "BH": $timezone = "Asia/Bahrain"; break; case "AZ": $timezone = "Asia/Baku"; break; case "TH": $timezone = "Asia/Bangkok"; break; case "LB": $timezone = "Asia/Beirut"; break; case "KG": $timezone = "Asia/Bishkek"; break; case "BN": $timezone = "Asia/Brunei"; break; case "IN": $timezone = "Asia/Calcutta"; break; case "MN": $timezone = "Asia/Choibalsan"; break; case "LK": $timezone = "Asia/Colombo"; break; case "BD": $timezone = "Asia/Dhaka"; break; case "AE": $timezone = "Asia/Dubai"; break; case "TJ": $timezone = "Asia/Dushanbe"; break; case "HK": $timezone = "Asia/Hong_Kong"; break; case "TR": $timezone = "Asia/Istanbul"; break; case "IL": $timezone = "Asia/Jerusalem"; break; case "AF": $timezone = "Asia/Kabul"; break; case "PK": $timezone = "Asia/Karachi"; break; case "NP": $timezone = "Asia/Katmandu"; break; case "KW": $timezone = "Asia/Kuwait"; break; case "MO": $timezone = "Asia/Macao"; break; case "PH": $timezone = "Asia/Manila"; break; case "OM": $timezone = "Asia/Muscat"; break; case "CY": $timezone = "Asia/Nicosia"; break; case "KP": $timezone = "Asia/Pyongyang"; break; case "QA": $timezone = "Asia/Qatar"; break; case "MM": $timezone = "Asia/Rangoon"; break; case "SA": $timezone = "Asia/Riyadh"; break; case "KR": $timezone = "Asia/Seoul"; break; case "SG": $timezone = "Asia/Singapore"; break; case "TW": $timezone = "Asia/Taipei"; break; case "GE": $timezone = "Asia/Tbilisi"; break; case "BT": $timezone = "Asia/Thimphu"; break; case "JP": $timezone = "Asia/Tokyo"; break; case "LA": $timezone = "Asia/Vientiane"; break; case "AM": $timezone = "Asia/Yerevan"; break; case "BM": $timezone = "Atlantic/Bermuda"; break; case "CV": $timezone = "Atlantic/Cape_Verde"; break; case "FO": $timezone = "Atlantic/Faeroe"; break; case "IS": $timezone = "Atlantic/Reykjavik"; break; case "GS": $timezone = "Atlantic/South_Georgia"; break; case "SH": $timezone = "Atlantic/St_Helena"; break; case "CL": $timezone = "Chile/Continental"; break; case "NL": $timezone = "Europe/Amsterdam"; break; case "AD": $timezone = "Europe/Andorra"; break; case "GR": $timezone = "Europe/Athens"; break; case "YU": $timezone = "Europe/Belgrade"; break; case "DE": $timezone = "Europe/Berlin"; break; case "SK": $timezone = "Europe/Bratislava"; break; case "BE": $timezone = "Europe/Brussels"; break; case "RO": $timezone = "Europe/Bucharest"; break; case "HU": $timezone = "Europe/Budapest"; break; case "DK": $timezone = "Europe/Copenhagen"; break; case "IE": $timezone = "Europe/Dublin"; break; case "GI": $timezone = "Europe/Gibraltar"; break; case "FI": $timezone = "Europe/Helsinki"; break; case "SI": $timezone = "Europe/Ljubljana"; break; case "GB": $timezone = "Europe/London"; break; case "LU": $timezone = "Europe/Luxembourg"; break; case "MT": $timezone = "Europe/Malta"; break; case "BY": $timezone = "Europe/Minsk"; break; case "MC": $timezone = "Europe/Monaco"; break; case "NO": $timezone = "Europe/Oslo"; break; case "CZ": $timezone = "Europe/Prague"; break; case "LV": $timezone = "Europe/Riga"; break; case "IT": $timezone = "Europe/Rome"; break; case "SM": $timezone = "Europe/San_Marino"; break; case "BA": $timezone = "Europe/Sarajevo"; break; case "MK": $timezone = "Europe/Skopje"; break; case "BG": $timezone = "Europe/Sofia"; break; case "SE": $timezone = "Europe/Stockholm"; break; case "EE": $timezone = "Europe/Tallinn"; break; case "AL": $timezone = "Europe/Tirane"; break; case "LI": $timezone = "Europe/Vaduz"; break; case "VA": $timezone = "Europe/Vatican"; break; case "AT": $timezone = "Europe/Vienna"; break; case "LT": $timezone = "Europe/Vilnius"; break; case "PL": $timezone = "Europe/Warsaw"; break; case "HR": $timezone = "Europe/Zagreb"; break; case "IR": $timezone = "Asia/Tehran"; break; case "MG": $timezone = "Indian/Antananarivo"; break; case "CX": $timezone = "Indian/Christmas"; break; case "CC": $timezone = "Indian/Cocos"; break; case "KM": $timezone = "Indian/Comoro"; break; case "MV": $timezone = "Indian/Maldives"; break; case "MU": $timezone = "Indian/Mauritius"; break; case "YT": $timezone = "Indian/Mayotte"; break; case "RE": $timezone = "Indian/Reunion"; break; case "FJ": $timezone = "Pacific/Fiji"; break; case "TV": $timezone = "Pacific/Funafuti"; break; case "GU": $timezone = "Pacific/Guam"; break; case "NR": $timezone = "Pacific/Nauru"; break; case "NU": $timezone = "Pacific/Niue"; break; case "NF": $timezone = "Pacific/Norfolk"; break; case "PW": $timezone = "Pacific/Palau"; break; case "PN": $timezone = "Pacific/Pitcairn"; break; case "CK": $timezone = "Pacific/Rarotonga"; break; case "WS": $timezone = "Pacific/Samoa"; break; case "KI": $timezone = "Pacific/Tarawa"; break; case "TO": $timezone = "Pacific/Tongatapu"; break; case "WF": $timezone = "Pacific/Wallis"; break; case "TZ": $timezone = "Africa/Dar_es_Salaam"; break; case "VN": $timezone = "Asia/Phnom_Penh"; break; case "KH": $timezone = "Asia/Phnom_Penh"; break; case "CM": $timezone = "Africa/Lagos"; break; case "DO": $timezone = "America/Santo_Domingo"; break; case "ET": $timezone = "Africa/Addis_Ababa"; break; case "FX": $timezone = "Europe/Paris"; break; case "HT": $timezone = "America/Port-au-Prince"; break; case "CH": $timezone = "Europe/Zurich"; break; case "AN": $timezone = "America/Curacao"; break; case "BJ": $timezone = "Africa/Porto-Novo"; break; case "EH": $timezone = "Africa/El_Aaiun"; break; case "FK": $timezone = "Atlantic/Stanley"; break; case "GF": $timezone = "America/Cayenne"; break; case "IO": $timezone = "Indian/Chagos"; break; case "MD": $timezone = "Europe/Chisinau"; break; case "MP": $timezone = "Pacific/Saipan"; break; case "MW": $timezone = "Africa/Blantyre"; break; case "NA": $timezone = "Africa/Windhoek"; break; case "NC": $timezone = "Pacific/Noumea"; break; case "PG": $timezone = "Pacific/Port_Moresby"; break; case "PM": $timezone = "America/Miquelon"; break; case "PS": $timezone = "Asia/Gaza"; break; case "PY": $timezone = "America/Asuncion"; break; case "SB": $timezone = "Pacific/Guadalcanal"; break; case "SC": $timezone = "Indian/Mahe"; break; case "SJ": $timezone = "Arctic/Longyearbyen"; break; case "SY": $timezone = "Asia/Damascus"; break; case "TC": $timezone = "America/Grand_Turk"; break; case "TF": $timezone = "Indian/Kerguelen"; break; case "TK": $timezone = "Pacific/Fakaofo"; break; case "TT": $timezone = "America/Port_of_Spain"; break; case "VG": $timezone = "America/Tortola"; break; case "VI": $timezone = "America/St_Thomas"; break; case "VU": $timezone = "Pacific/Efate"; break; case "RS": $timezone = "Europe/Belgrade"; break; case "ME": $timezone = "Europe/Podgorica"; break; case "AX": $timezone = "Europe/Mariehamn"; break; case "GG": $timezone = "Europe/Guernsey"; break; case "IM": $timezone = "Europe/Isle_of_Man"; break; case "JE": $timezone = "Europe/Jersey"; break; case "BL": $timezone = "America/St_Barthelemy"; break; case "MF": $timezone = "America/Marigot"; break; case "AR": switch ($region) { case "01": $timezone = "America/Argentina/Buenos_Aires"; break; case "02": $timezone = "America/Argentina/Catamarca"; break; case "03": $timezone = "America/Argentina/Tucuman"; break; case "04": $timezone = "America/Argentina/Rio_Gallegos"; break; case "05": $timezone = "America/Argentina/Cordoba"; break; case "06": $timezone = "America/Argentina/Tucuman"; break; case "07": $timezone = "America/Argentina/Buenos_Aires"; break; case "08": $timezone = "America/Argentina/Buenos_Aires"; break; case "09": $timezone = "America/Argentina/Tucuman"; break; case "10": $timezone = "America/Argentina/Jujuy"; break; case "11": $timezone = "America/Argentina/San_Luis"; break; case "12": $timezone = "America/Argentina/La_Rioja"; break; case "13": $timezone = "America/Argentina/Mendoza"; break; case "14": $timezone = "America/Argentina/Buenos_Aires"; break; case "15": $timezone = "America/Argentina/San_Luis"; break; case "16": $timezone = "America/Argentina/Buenos_Aires"; break; case "17": $timezone = "America/Argentina/Salta"; break; case "18": $timezone = "America/Argentina/San_Juan"; break; case "19": $timezone = "America/Argentina/San_Luis"; break; case "20": $timezone = "America/Argentina/Rio_Gallegos"; break; case "21": $timezone = "America/Argentina/Buenos_Aires"; break; case "22": $timezone = "America/Argentina/Catamarca"; break; case "23": $timezone = "America/Argentina/Ushuaia"; break; case "24": $timezone = "America/Argentina/Tucuman"; break; } break; case "BR": switch ($region) { case "01": $timezone = "America/Rio_Branco"; break; case "02": $timezone = "America/Maceio"; break; case "03": $timezone = "America/Sao_Paulo"; break; case "04": $timezone = "America/Manaus"; break; case "05": $timezone = "America/Bahia"; break; case "06": $timezone = "America/Fortaleza"; break; case "07": $timezone = "America/Sao_Paulo"; break; case "08": $timezone = "America/Sao_Paulo"; break; case "11": $timezone = "America/Campo_Grande"; break; case "13": $timezone = "America/Belem"; break; case "14": $timezone = "America/Cuiaba"; break; case "15": $timezone = "America/Sao_Paulo"; break; case "16": $timezone = "America/Belem"; break; case "17": $timezone = "America/Recife"; break; case "18": $timezone = "America/Sao_Paulo"; break; case "20": $timezone = "America/Fortaleza"; break; case "21": $timezone = "America/Sao_Paulo"; break; case "22": $timezone = "America/Recife"; break; case "23": $timezone = "America/Sao_Paulo"; break; case "24": $timezone = "America/Porto_Velho"; break; case "25": $timezone = "America/Boa_Vista"; break; case "26": $timezone = "America/Sao_Paulo"; break; case "27": $timezone = "America/Sao_Paulo"; break; case "28": $timezone = "America/Maceio"; break; case "29": $timezone = "America/Sao_Paulo"; break; case "30": $timezone = "America/Recife"; break; case "31": $timezone = "America/Araguaina"; break; } break; case "CD": switch ($region) { case "02": $timezone = "Africa/Kinshasa"; break; case "05": $timezone = "Africa/Lubumbashi"; break; case "06": $timezone = "Africa/Kinshasa"; break; case "08": $timezone = "Africa/Kinshasa"; break; case "10": $timezone = "Africa/Lubumbashi"; break; case "11": $timezone = "Africa/Lubumbashi"; break; case "12": $timezone = "Africa/Lubumbashi"; break; } break; case "CN": switch ($region) { case "01": $timezone = "Asia/Shanghai"; break; case "02": $timezone = "Asia/Shanghai"; break; case "03": $timezone = "Asia/Shanghai"; break; case "04": $timezone = "Asia/Shanghai"; break; case "05": $timezone = "Asia/Harbin"; break; case "06": $timezone = "Asia/Chongqing"; break; case "07": $timezone = "Asia/Shanghai"; break; case "08": $timezone = "Asia/Harbin"; break; case "09": $timezone = "Asia/Shanghai"; break; case "10": $timezone = "Asia/Shanghai"; break; case "11": $timezone = "Asia/Chongqing"; break; case "12": $timezone = "Asia/Shanghai"; break; case "13": $timezone = "Asia/Urumqi"; break; case "14": $timezone = "Asia/Chongqing"; break; case "15": $timezone = "Asia/Chongqing"; break; case "16": $timezone = "Asia/Chongqing"; break; case "18": $timezone = "Asia/Chongqing"; break; case "19": $timezone = "Asia/Harbin"; break; case "20": $timezone = "Asia/Harbin"; break; case "21": $timezone = "Asia/Chongqing"; break; case "22": $timezone = "Asia/Harbin"; break; case "23": $timezone = "Asia/Shanghai"; break; case "24": $timezone = "Asia/Chongqing"; break; case "25": $timezone = "Asia/Shanghai"; break; case "26": $timezone = "Asia/Chongqing"; break; case "28": $timezone = "Asia/Shanghai"; break; case "29": $timezone = "Asia/Chongqing"; break; case "30": $timezone = "Asia/Chongqing"; break; case "31": $timezone = "Asia/Chongqing"; break; case "32": $timezone = "Asia/Chongqing"; break; case "33": $timezone = "Asia/Chongqing"; break; } break; case "EC": switch ($region) { case "01": $timezone = "Pacific/Galapagos"; break; case "02": $timezone = "America/Guayaquil"; break; case "03": $timezone = "America/Guayaquil"; break; case "04": $timezone = "America/Guayaquil"; break; case "05": $timezone = "America/Guayaquil"; break; case "06": $timezone = "America/Guayaquil"; break; case "07": $timezone = "America/Guayaquil"; break; case "08": $timezone = "America/Guayaquil"; break; case "09": $timezone = "America/Guayaquil"; break; case "10": $timezone = "America/Guayaquil"; break; case "11": $timezone = "America/Guayaquil"; break; case "12": $timezone = "America/Guayaquil"; break; case "13": $timezone = "America/Guayaquil"; break; case "14": $timezone = "America/Guayaquil"; break; case "15": $timezone = "America/Guayaquil"; break; case "17": $timezone = "America/Guayaquil"; break; case "18": $timezone = "America/Guayaquil"; break; case "19": $timezone = "America/Guayaquil"; break; case "20": $timezone = "America/Guayaquil"; break; case "22": $timezone = "America/Guayaquil"; break; } break; case "ES": switch ($region) { case "07": $timezone = "Europe/Madrid"; break; case "27": $timezone = "Europe/Madrid"; break; case "29": $timezone = "Europe/Madrid"; break; case "31": $timezone = "Europe/Madrid"; break; case "32": $timezone = "Europe/Madrid"; break; case "34": $timezone = "Europe/Madrid"; break; case "39": $timezone = "Europe/Madrid"; break; case "51": $timezone = "Africa/Ceuta"; break; case "52": $timezone = "Europe/Madrid"; break; case "53": $timezone = "Atlantic/Canary"; break; case "54": $timezone = "Europe/Madrid"; break; case "55": $timezone = "Europe/Madrid"; break; case "56": $timezone = "Europe/Madrid"; break; case "57": $timezone = "Europe/Madrid"; break; case "58": $timezone = "Europe/Madrid"; break; case "59": $timezone = "Europe/Madrid"; break; case "60": $timezone = "Europe/Madrid"; break; } break; case "GL": switch ($region) { case "01": $timezone = "America/Thule"; break; case "02": $timezone = "America/Godthab"; break; case "03": $timezone = "America/Godthab"; break; } break; case "ID": switch ($region) { case "01": $timezone = "Asia/Pontianak"; break; case "02": $timezone = "Asia/Makassar"; break; case "03": $timezone = "Asia/Jakarta"; break; case "04": $timezone = "Asia/Jakarta"; break; case "05": $timezone = "Asia/Jakarta"; break; case "06": $timezone = "Asia/Jakarta"; break; case "07": $timezone = "Asia/Jakarta"; break; case "08": $timezone = "Asia/Jakarta"; break; case "09": $timezone = "Asia/Jayapura"; break; case "10": $timezone = "Asia/Jakarta"; break; case "11": $timezone = "Asia/Pontianak"; break; case "12": $timezone = "Asia/Makassar"; break; case "13": $timezone = "Asia/Makassar"; break; case "14": $timezone = "Asia/Makassar"; break; case "15": $timezone = "Asia/Jakarta"; break; case "16": $timezone = "Asia/Makassar"; break; case "17": $timezone = "Asia/Makassar"; break; case "18": $timezone = "Asia/Makassar"; break; case "19": $timezone = "Asia/Pontianak"; break; case "20": $timezone = "Asia/Makassar"; break; case "21": $timezone = "Asia/Makassar"; break; case "22": $timezone = "Asia/Makassar"; break; case "23": $timezone = "Asia/Makassar"; break; case "24": $timezone = "Asia/Jakarta"; break; case "25": $timezone = "Asia/Pontianak"; break; case "26": $timezone = "Asia/Pontianak"; break; case "30": $timezone = "Asia/Jakarta"; break; case "31": $timezone = "Asia/Makassar"; break; case "33": $timezone = "Asia/Jakarta"; break; } break; case "KZ": switch ($region) { case "01": $timezone = "Asia/Almaty"; break; case "02": $timezone = "Asia/Almaty"; break; case "03": $timezone = "Asia/Qyzylorda"; break; case "04": $timezone = "Asia/Aqtobe"; break; case "05": $timezone = "Asia/Qyzylorda"; break; case "06": $timezone = "Asia/Aqtau"; break; case "07": $timezone = "Asia/Oral"; break; case "08": $timezone = "Asia/Qyzylorda"; break; case "09": $timezone = "Asia/Aqtau"; break; case "10": $timezone = "Asia/Qyzylorda"; break; case "11": $timezone = "Asia/Almaty"; break; case "12": $timezone = "Asia/Qyzylorda"; break; case "13": $timezone = "Asia/Aqtobe"; break; case "14": $timezone = "Asia/Qyzylorda"; break; case "15": $timezone = "Asia/Almaty"; break; case "16": $timezone = "Asia/Aqtobe"; break; case "17": $timezone = "Asia/Almaty"; break; } break; case "MX": switch ($region) { case "01": $timezone = "America/Mexico_City"; break; case "02": $timezone = "America/Tijuana"; break; case "03": $timezone = "America/Hermosillo"; break; case "04": $timezone = "America/Merida"; break; case "05": $timezone = "America/Mexico_City"; break; case "06": $timezone = "America/Chihuahua"; break; case "07": $timezone = "America/Monterrey"; break; case "08": $timezone = "America/Mexico_City"; break; case "09": $timezone = "America/Mexico_City"; break; case "10": $timezone = "America/Mazatlan"; break; case "11": $timezone = "America/Mexico_City"; break; case "12": $timezone = "America/Mexico_City"; break; case "13": $timezone = "America/Mexico_City"; break; case "14": $timezone = "America/Mazatlan"; break; case "15": $timezone = "America/Chihuahua"; break; case "16": $timezone = "America/Mexico_City"; break; case "17": $timezone = "America/Mexico_City"; break; case "18": $timezone = "America/Mazatlan"; break; case "19": $timezone = "America/Monterrey"; break; case "20": $timezone = "America/Mexico_City"; break; case "21": $timezone = "America/Mexico_City"; break; case "22": $timezone = "America/Mexico_City"; break; case "23": $timezone = "America/Cancun"; break; case "24": $timezone = "America/Mexico_City"; break; case "25": $timezone = "America/Mazatlan"; break; case "26": $timezone = "America/Hermosillo"; break; case "27": $timezone = "America/Merida"; break; case "28": $timezone = "America/Monterrey"; break; case "29": $timezone = "America/Mexico_City"; break; case "30": $timezone = "America/Mexico_City"; break; case "31": $timezone = "America/Merida"; break; case "32": $timezone = "America/Monterrey"; break; } break; case "MY": switch ($region) { case "01": $timezone = "Asia/Kuala_Lumpur"; break; case "02": $timezone = "Asia/Kuala_Lumpur"; break; case "03": $timezone = "Asia/Kuala_Lumpur"; break; case "04": $timezone = "Asia/Kuala_Lumpur"; break; case "05": $timezone = "Asia/Kuala_Lumpur"; break; case "06": $timezone = "Asia/Kuala_Lumpur"; break; case "07": $timezone = "Asia/Kuala_Lumpur"; break; case "08": $timezone = "Asia/Kuala_Lumpur"; break; case "09": $timezone = "Asia/Kuala_Lumpur"; break; case "11": $timezone = "Asia/Kuching"; break; case "12": $timezone = "Asia/Kuala_Lumpur"; break; case "13": $timezone = "Asia/Kuala_Lumpur"; break; case "14": $timezone = "Asia/Kuala_Lumpur"; break; case "15": $timezone = "Asia/Kuching"; break; case "16": $timezone = "Asia/Kuching"; break; } break; case "NZ": switch ($region) { case "85": $timezone = "Pacific/Auckland"; break; case "E7": $timezone = "Pacific/Auckland"; break; case "E8": $timezone = "Pacific/Auckland"; break; case "E9": $timezone = "Pacific/Auckland"; break; case "F1": $timezone = "Pacific/Auckland"; break; case "F2": $timezone = "Pacific/Auckland"; break; case "F3": $timezone = "Pacific/Auckland"; break; case "F4": $timezone = "Pacific/Auckland"; break; case "F5": $timezone = "Pacific/Auckland"; break; case "F7": $timezone = "Pacific/Chatham"; break; case "F8": $timezone = "Pacific/Auckland"; break; case "F9": $timezone = "Pacific/Auckland"; break; case "G1": $timezone = "Pacific/Auckland"; break; case "G2": $timezone = "Pacific/Auckland"; break; case "G3": $timezone = "Pacific/Auckland"; break; } break; case "PT": switch ($region) { case "02": $timezone = "Europe/Lisbon"; break; case "03": $timezone = "Europe/Lisbon"; break; case "04": $timezone = "Europe/Lisbon"; break; case "05": $timezone = "Europe/Lisbon"; break; case "06": $timezone = "Europe/Lisbon"; break; case "07": $timezone = "Europe/Lisbon"; break; case "08": $timezone = "Europe/Lisbon"; break; case "09": $timezone = "Europe/Lisbon"; break; case "10": $timezone = "Atlantic/Madeira"; break; case "11": $timezone = "Europe/Lisbon"; break; case "13": $timezone = "Europe/Lisbon"; break; case "14": $timezone = "Europe/Lisbon"; break; case "16": $timezone = "Europe/Lisbon"; break; case "17": $timezone = "Europe/Lisbon"; break; case "18": $timezone = "Europe/Lisbon"; break; case "19": $timezone = "Europe/Lisbon"; break; case "20": $timezone = "Europe/Lisbon"; break; case "21": $timezone = "Europe/Lisbon"; break; case "22": $timezone = "Europe/Lisbon"; break; } break; case "RU": switch ($region) { case "01": $timezone = "Europe/Volgograd"; break; case "02": $timezone = "Asia/Irkutsk"; break; case "03": $timezone = "Asia/Novokuznetsk"; break; case "04": $timezone = "Asia/Novosibirsk"; break; case "05": $timezone = "Asia/Vladivostok"; break; case "06": $timezone = "Europe/Moscow"; break; case "07": $timezone = "Europe/Volgograd"; break; case "08": $timezone = "Europe/Samara"; break; case "09": $timezone = "Europe/Moscow"; break; case "10": $timezone = "Europe/Moscow"; break; case "11": $timezone = "Asia/Irkutsk"; break; case "13": $timezone = "Asia/Yekaterinburg"; break; case "14": $timezone = "Asia/Irkutsk"; break; case "15": $timezone = "Asia/Anadyr"; break; case "16": $timezone = "Europe/Samara"; break; case "17": $timezone = "Europe/Volgograd"; break; case "18": $timezone = "Asia/Krasnoyarsk"; break; case "20": $timezone = "Asia/Irkutsk"; break; case "21": $timezone = "Europe/Moscow"; break; case "22": $timezone = "Europe/Volgograd"; break; case "23": $timezone = "Europe/Kaliningrad"; break; case "24": $timezone = "Europe/Volgograd"; break; case "25": $timezone = "Europe/Moscow"; break; case "26": $timezone = "Asia/Kamchatka"; break; case "27": $timezone = "Europe/Volgograd"; break; case "28": $timezone = "Europe/Moscow"; break; case "29": $timezone = "Asia/Novokuznetsk"; break; case "30": $timezone = "Asia/Vladivostok"; break; case "31": $timezone = "Asia/Krasnoyarsk"; break; case "32": $timezone = "Asia/Omsk"; break; case "33": $timezone = "Asia/Yekaterinburg"; break; case "34": $timezone = "Asia/Yekaterinburg"; break; case "35": $timezone = "Asia/Yekaterinburg"; break; case "36": $timezone = "Asia/Anadyr"; break; case "37": $timezone = "Europe/Moscow"; break; case "38": $timezone = "Europe/Volgograd"; break; case "39": $timezone = "Asia/Krasnoyarsk"; break; case "40": $timezone = "Asia/Yekaterinburg"; break; case "41": $timezone = "Europe/Moscow"; break; case "42": $timezone = "Europe/Moscow"; break; case "43": $timezone = "Europe/Moscow"; break; case "44": $timezone = "Asia/Magadan"; break; case "45": $timezone = "Europe/Samara"; break; case "46": $timezone = "Europe/Samara"; break; case "47": $timezone = "Europe/Moscow"; break; case "48": $timezone = "Europe/Moscow"; break; case "49": $timezone = "Europe/Moscow"; break; case "50": $timezone = "Asia/Yekaterinburg"; break; case "51": $timezone = "Europe/Moscow"; break; case "52": $timezone = "Europe/Moscow"; break; case "53": $timezone = "Asia/Novosibirsk"; break; case "54": $timezone = "Asia/Omsk"; break; case "55": $timezone = "Europe/Samara"; break; case "56": $timezone = "Europe/Moscow"; break; case "57": $timezone = "Europe/Samara"; break; case "58": $timezone = "Asia/Yekaterinburg"; break; case "59": $timezone = "Asia/Vladivostok"; break; case "60": $timezone = "Europe/Kaliningrad"; break; case "61": $timezone = "Europe/Volgograd"; break; case "62": $timezone = "Europe/Moscow"; break; case "63": $timezone = "Asia/Yakutsk"; break; case "64": $timezone = "Asia/Sakhalin"; break; case "65": $timezone = "Europe/Samara"; break; case "66": $timezone = "Europe/Moscow"; break; case "67": $timezone = "Europe/Samara"; break; case "68": $timezone = "Europe/Volgograd"; break; case "69": $timezone = "Europe/Moscow"; break; case "70": $timezone = "Europe/Volgograd"; break; case "71": $timezone = "Asia/Yekaterinburg"; break; case "72": $timezone = "Europe/Moscow"; break; case "73": $timezone = "Europe/Samara"; break; case "74": $timezone = "Asia/Krasnoyarsk"; break; case "75": $timezone = "Asia/Novosibirsk"; break; case "76": $timezone = "Europe/Moscow"; break; case "77": $timezone = "Europe/Moscow"; break; case "78": $timezone = "Asia/Yekaterinburg"; break; case "79": $timezone = "Asia/Irkutsk"; break; case "80": $timezone = "Asia/Yekaterinburg"; break; case "81": $timezone = "Europe/Samara"; break; case "82": $timezone = "Asia/Irkutsk"; break; case "83": $timezone = "Europe/Moscow"; break; case "84": $timezone = "Europe/Volgograd"; break; case "85": $timezone = "Europe/Moscow"; break; case "86": $timezone = "Europe/Moscow"; break; case "87": $timezone = "Asia/Novosibirsk"; break; case "88": $timezone = "Europe/Moscow"; break; case "89": $timezone = "Asia/Vladivostok"; break; } break; case "UA": switch ($region) { case "01": $timezone = "Europe/Kiev"; break; case "02": $timezone = "Europe/Kiev"; break; case "03": $timezone = "Europe/Uzhgorod"; break; case "04": $timezone = "Europe/Zaporozhye"; break; case "05": $timezone = "Europe/Zaporozhye"; break; case "06": $timezone = "Europe/Uzhgorod"; break; case "07": $timezone = "Europe/Zaporozhye"; break; case "08": $timezone = "Europe/Simferopol"; break; case "09": $timezone = "Europe/Kiev"; break; case "10": $timezone = "Europe/Zaporozhye"; break; case "11": $timezone = "Europe/Simferopol"; break; case "13": $timezone = "Europe/Kiev"; break; case "14": $timezone = "Europe/Zaporozhye"; break; case "15": $timezone = "Europe/Uzhgorod"; break; case "16": $timezone = "Europe/Zaporozhye"; break; case "17": $timezone = "Europe/Simferopol"; break; case "18": $timezone = "Europe/Zaporozhye"; break; case "19": $timezone = "Europe/Kiev"; break; case "20": $timezone = "Europe/Simferopol"; break; case "21": $timezone = "Europe/Kiev"; break; case "22": $timezone = "Europe/Uzhgorod"; break; case "23": $timezone = "Europe/Kiev"; break; case "24": $timezone = "Europe/Uzhgorod"; break; case "25": $timezone = "Europe/Uzhgorod"; break; case "26": $timezone = "Europe/Zaporozhye"; break; case "27": $timezone = "Europe/Kiev"; break; } break; case "UZ": switch ($region) { case "01": $timezone = "Asia/Tashkent"; break; case "02": $timezone = "Asia/Samarkand"; break; case "03": $timezone = "Asia/Tashkent"; break; case "06": $timezone = "Asia/Tashkent"; break; case "07": $timezone = "Asia/Samarkand"; break; case "08": $timezone = "Asia/Samarkand"; break; case "09": $timezone = "Asia/Samarkand"; break; case "10": $timezone = "Asia/Samarkand"; break; case "12": $timezone = "Asia/Samarkand"; break; case "13": $timezone = "Asia/Tashkent"; break; case "14": $timezone = "Asia/Tashkent"; break; } break; case "TL": $timezone = "Asia/Dili"; break; case "PF": $timezone = "Pacific/Marquesas"; break; } return $timezone; } function normalizeURI($uri) { $uri=quoted_printable_decode($uri); if (preg_match("/^(.*)/",$uri,$m)) { if (preg_match("/^(.*):/U",$m[2],$p)){ $uri=$m[1]."@".$p[1].">"; } else { $uri=$m[1]."@".$m[2]; } } else if (preg_match("/^(sips?:.*)[=:;]/U",$uri,$p)) { $uri=$p[1]; } return $uri; } function normalizeTime($period) { $sec=$period%60; $min=floor($period/60); $h=floor($min/60); if (!$period) return ; if ($h>0) { $min=$min-60*$h; } if ($h >= 1) { return sprintf('%dh%02d\'%02d"', $h, $min, $sec); } else { return sprintf('%d\'%02d"', $min, $sec); } } function checkURI($uri) { //dprint ("checkURI($uri) "); if ($uri == "") return true; if (preg_match("/^(sip:|sips:)(.*)$/",$uri,$m)) $uri=$m[2]; $regexp = "/^(\+?[a-z0-9*][a-z0-9_.*-]*)@([a-z0-9][a-z0-9-]*\.)+(([a-z]{2,})|(\d+))$/i"; if (stristr($uri,"-.") || !preg_match($regexp, $uri)) { print "Invalid URI \"$uri\". "; return false; } return true; } function checkPhonebookURI($uri) { $regexp = "/^sip:([a-z0-9%_.-]*)@([a-z0-9%.-]*)$/i"; if (stristr($contact,"-.") || !preg_match($regexp, $uri)) { print "Invalid URI \"$uri\". "; return false; } return true; } function getLocalTime($timezone, $timestamp) { $tz = getenv('TZ'); putenv("TZ=$timezone"); if (!$timestamp) { return; } $LocalTime = date("Y-m-d H:i:s", $timestamp); putenv("TZ=$tz"); return $LocalTime; } function getSipThorHomeNode ($account,$sip_proxy) { if (!$account || !$sip_proxy) return false; $socket = fsockopen($sip_proxy, 9500, $errno, $errstr, 1); if (!$socket) { return false; } $request=sprintf("lookup sip_proxy for %s",$account); if (fputs($socket,"$request\r\n") !== false) { $ret = fgets($socket,4096); } fclose($socket); return $ret; } function getSipAccountFromX509Certificate($account='') { if (!$account) { print _('Error, please specify an account'); return false; } list($username, $domain) = explode("@",$account); if (!$username || !$domain) { print _("Invalid account provided"); return false; } if (!$_SERVER[SSL_CLIENT_CERT]) { print _("Error: No X.509 client certificate provided\n"); return false; } if (!$cert=openssl_x509_parse($_SERVER[SSL_CLIENT_CERT])) { print _("Error: Failed to parse X.509 client certificate\n"); return false; } require("/etc/cdrtool/ngnpro_engines.inc"); global $domainFilters, $resellerFilters, $soapEngines; if ($domainFilters[$domain]['sip_engine']) { $credentials['engine'] = $domainFilters[$domain]['sip_engine']; $credentials['customer'] = $domainFilters[$domain]['customer']; $credentials['reseller'] = $domainFilters[$domain]['reseller']; } else if ($domainFilters['default']['sip_engine']) { $credentials['engine']=$domainFilters['default']['sip_engine']; } else { print "Error: no domainFilter available in ngnpro_engines.inc"; return false; } $SOAPlogin=array( "username" => $soapEngines[$credentials['engine']]['username'], "password" => $soapEngines[$credentials['engine']]['password'], "admin" => true ); $SoapAuth = array('auth', $SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $SipPort = new WebService_NGNPro_SipPort($soapEngines[$credentials['engine']]['url']); $SipPort->_options['timeout'] = 5; $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $SipPort->addHeader($SoapAuth); // Filter $filter=array('username' => $username, 'domain' => $domain, 'owner' => intval($cert['subject']['CN']) ); // Range $range=array('start' => 0, 'count' => 10 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $result = $SipPort->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error from %s (SipPort): %s (%s): %s",$soapEngines[$credentials['engine']]['url'],$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } if ($result->total != 1) { return false; } $credentials['account'] = $account; $credentials['customer'] = $result->customer; $credentials['reseller'] = $result->reseller; return $credentials; } function getSipAccountFromHTTPDigest () { require("/etc/cdrtool/enrollment/config.ini"); if (!is_array($enrollment) || !strlen($enrollment['nonce_key'])) { $log= 'Error: Missing nonce in enrollment settings'; syslog(LOG_NOTICE, $log); die($log); return false; } if ($_REQUEST['realm']) { // required by Blink cocoa $realm=$_REQUEST['realm']; $a=explode("@",$realm); if (count($a) == 2) { $realm = $a[1]; } } else { $realm = 'SIP_settings'; } // security implemented based on // http://static.springsource.org/spring-security/site/docs/2.0.x/reference/digest.html $_id = microtime(true)+ 300; // expires 5 minutes in the future $_key = $enrollment['nonce_key']; $nonce = base64_encode($_id.":".md5($_id.":".$_key)); if (empty($_SERVER['PHP_AUTH_DIGEST'])) { header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); //syslog(LOG_NOTICE, sprintf ("SIP settings page: sent auth request for realm %s to %s", $realm, $_SERVER['REMOTE_ADDR'])); die(); } // analyze the PHP_AUTH_DIGEST variable if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($data['username'])) { $log=sprintf("SIP settings page: Invalid credentials from %s", $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die($log); } // generate the valid response $username = $data['username']; if (strstr($username, '@')) { $a = explode("@",$username); $username = $a[0]; $domain = $a[1]; } else { $domain = $realm; } require("/etc/cdrtool/ngnpro_engines.inc"); global $domainFilters, $resellerFilters, $soapEngines ; $credentials['account'] = sprintf("%s@%s",$username, $domain); if ($domainFilters[$domain]['sip_engine']) { $credentials['engine'] = $domainFilters[$domain]['sip_engine']; $credentials['customer'] = $domainFilters[$domain]['customer']; $credentials['reseller'] = $domainFilters[$domain]['reseller']; } else if ($domainFilters['default']['sip_engine']) { $credentials['engine']=$domainFilters['default']['sip_engine']; } else { $log=sprintf("SIP settings page error: no domainFilter available in ngnpro_engines.inc from %s", $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } $SOAPlogin=array( "username" => $soapEngines[$credentials['engine']]['username'], "password" => $soapEngines[$credentials['engine']]['password'], "admin" => true ); $SoapAuth = array('auth', $SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $SipPort = new WebService_NGNPro_SipPort($soapEngines[$credentials['engine']]['url']); $SipPort->_options['timeout'] = 5; $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $SipPort->addHeader($SoapAuth); $result = $SipPort->getAccount(array("username" =>$username,"domain" =>$domain)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: non-existent username %s from %s", $credentials['account'], $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } $web_password=''; foreach ($result->properties as $_property) { if ($_property->name == 'web_password') { //$web_password = explode(":", $_property->value, -1); $split=explode(":",$_property->value); $web_password=$split['0']; break; } } if (!empty($web_password)) { //$A1 = md5($data['username'] . ':' . $realm . ':' . $data['password']); $A1 = $web_password; $login_type_log = 'web password'; //$log=sprintf("TEST %s %s %s %s", $data['username'], $realm, $web_password , $data['nonce']); //syslog(LOG_NOTICE, $log); // } else if (strstr($data['username'], '@')) { // $A1 = md5($data['username'] . ':' . $realm . ':' . $result->password); // $login_type_log = 'cleartext legacy password'; } else if ($result->ha1) { $login_type_log = sprintf('encrypted password'); $A1 = $result->ha1; } else { $A1 = md5($data['username'] . ':' . $realm . ':' . $result->password); $login_type_log = 'cleartext password'; } $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); if ($data['response'] != $valid_response ) { header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: wrong credentials using %s for %s from %s", $login_type_log, $credentials['account'], $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } // check nonce $client_nonce_els=explode(":",base64_decode($data['nonce'])); if (md5($client_nonce_els[0].":".$_key) != $client_nonce_els[1]) { header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: wrong nonce for %s from %s", $credentials['account'], $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } if (microtime(true) > $client_nonce_els[0]) { // nonce is stale header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",stale=true,opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: nonce has expired for %s from %s", $username, $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } $log=sprintf("SIP settings page: %s logged in using %s from %s", $credentials['account'], $login_type_log, $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); $credentials['customer'] = $result->customer; $credentials['reseller'] = $result->reseller; return $credentials; } function http_digest_parse($txt) { // function to parse the http auth header // protect against missing data $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); $data = array(); $keys = implode('|', array_keys($needed_parts)); preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER); foreach ($matches as $m) { $data[$m[1]] = $m[3] ? $m[3] : $m[4]; unset($needed_parts[$m[1]]); } return $needed_parts ? false : $data; } function renderUI($SipSettings_class,$account,$login_credentials,$soapEngines) { // Generic code for all sip settings pages $SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines); if ($_REQUEST['action']) { $log_action=$_REQUEST['action']; } else { $log_action='load main page'; } $log=sprintf("SIP settings page: %s for %s from %s", $log_action, $account, $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); if (!strstr($_REQUEST['action'],'get_') && !strstr($_REQUEST['action'],'set_') && !strstr($_REQUEST['action'],'put_') && !strstr($_REQUEST['action'],'delete_') && !strstr($_REQUEST['action'],'export_') && !strstr($_REQUEST['action'],'add_')) { $title = "$account"; if (array_key_exists($SipSettings->tab, $SipSettings->tabs)) { $title = $SipSettings->tabs[$SipSettings->tab]. " - ". $title; } $header = $SipSettings->headerFile; $css = $SipSettings->cssFile; $auto_refesh_tab=$SipSettings->auto_refesh_tab; $absolute_url= $SipSettings->absolute_url; include($header); dprint("Header file $header included, refresh=$auto_refesh_tab"); include($css); dprint("CSS file $css included"); } if ($_REQUEST['action']=="save settings") { if ($SipSettings->checkSettings()) { $SipSettings->saveSettings(); unset($SipSettings); $SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines); } else { print ""; printf (_("Error: %s"),$SipSettings->error); print ""; } } else if ($_REQUEST['action']=="set diversions") { $SipSettings->setDiversions(); unset($SipSettings); $SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines); } else if ($_REQUEST['action']=="set barring") { $SipSettings->setBarringPrefixes(); } else if ($_REQUEST['action']=="set reject") { $SipSettings->setRejectMembers(); } else if ($_REQUEST['action']=="set accept rules") { $SipSettings->setAcceptRules(); } else if ($_REQUEST['action']=="set aliases") { $SipSettings->setAliases(); } else if ($_REQUEST['action']=="send email") { $SipSettings->sendEmail(); } else if ($_REQUEST['action']=="delete account") { $SipSettings->deleteAccount(); } else if ($_REQUEST['action']=="delete_account") { // print "

    ";
            // print_r($SipSettings->Preferences);
             $date1= new datetime($SipSettings->Preferences['account_delete_request']);
             $today= new datetime('now');
             if ($date1->diff($today)->d <= '2' && $SipSettings->Preferences['account_delete_request'] ) {
     
                 $SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
                 $result = $SipSettings->SipPort->deleteAccount($SipSettings->sipId);
     
                 if ((new PEAR)->isError($result)) {
                     $error_msg  = $result->getMessage();
                     $error_fault= $result->getFault();
                     $error_code = $result->getCode();
                     $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
                     $return=array('success'       => false,
                                 'error_message' => $_msg
                                 );
                     return false;
                 }  else {
                     printf("

    The account %s has been removed

    ",$SipSettings->account); $SipSettings->sendRemoveAccount(); //print "" print ""; print _("Click here to Logout"); print ""; //$auth->logout(); //$sess->delete(); return true; } } else { printf("The delete request for account %s has expired or is not valid",$SipSettings->account); return false; } return true ; //$SipSettings->deleteAccount(); } else if ($_REQUEST['action']=="get_crt") { $SipSettings->exportCertificateX509(); return true; } else if ($_REQUEST['action']=="get_p12") { $SipSettings->exportCertificateP12(); return true; } else if ($_REQUEST['action'] == 'get_balance_history') { $SipSettings->getBalanceHistory(); if ($_REQUEST['csv']) { $SipSettings->exportBalanceHistory(); } else { print json_encode($SipSettings->balance_history); } return true; } else if ($_REQUEST['action'] == 'get_call_forwarding') { $SipSettings->getDiversions(); print json_encode($SipSettings->diversions); return true; } else if ($_REQUEST['action'] == 'get_prepaid') { $SipSettings->getPrepaidStatus(); print json_encode($SipSettings->prepaidAccount); return true; } else if ($_REQUEST['action'] == 'get_monthly_usage') { $SipSettings->getCallStatistics(); print json_encode($SipSettings->thisMonth); return true; } else if ($_REQUEST['action'] == 'get_accept_rules'){ $SipSettings->getAcceptRules(); print json_encode($SipSettings->acceptRules); return true; } else if ($_REQUEST['action'] == 'get_journal_entries'){ $SipSettings->getJournalEntries(); print json_encode($SipSettings->journalEntries); return true; } else if ($_REQUEST['action'] == 'put_journal_entries'){ print json_encode($SipSettings->putJournalEntries()); return true; } else if ($_REQUEST['action'] == 'delete_journal_entries'){ print json_encode($SipSettings->deleteJournalEntries()); return true; } else if ($_REQUEST['action'] == 'get_reject_rules'){ $SipSettings->getRejectMembers(); print json_encode($SipSettings->rejectMembers); return true; } else if ($_REQUEST['action'] == 'get_history'){ $SipSettings->getHistory('completed'); print json_encode($SipSettings->call_history); return true; } else if ($_REQUEST['action'] == 'get_voicemail'){ $SipSettings->getVoicemail(); print json_encode($SipSettings->voicemail); return true; } else if ($_REQUEST['action'] == 'get_aliases'){ $SipSettings->getAliases(); print json_encode($SipSettings->aliases); return true; } else if ($_REQUEST['action'] == 'get_enum'){ $SipSettings->getEnumMappings(); print json_encode($SipSettings->enums); return true; } else if ($_REQUEST['action'] == 'export_identity_proof'){ $SipSettings->exportIdentityProof(); return true; } else if ($_REQUEST['action'] == 'add_balance'){ if (!$_REQUEST['id'] || !$_REQUEST['number']) { $return=array('success' => false, 'error_message' => 'Missing id or number' ); print (json_encode($return)); return false; } $card = array('id' => intval($_REQUEST['id']), 'number' => $_REQUEST['number'] ); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->addBalanceFromVoucher($SipSettings->sipId,$card); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $return=array('success' => false, 'error_message' => $_msg ); print (json_encode($return)); return false; } else { $return=array('success' => true, 'error_message' => 'Added balance succeeded' ); print (json_encode($return)); return true; } } else if ($_REQUEST['action'] == 'get_identity'){ $account=array('sip_address' => $SipSettings->account, 'email' => $SipSettings->email, 'first' => $SipSettings->firstName, 'lastname' => $SipSettings->lastName, 'pstn_caller_id' => $SipSettings->rpid, 'mobile_number' => $SipSettings->mobile_number, 'timezone' => $SipSettings->timezone, 'no_answer_timeout' => $SipSettings->timeout, 'quick_dial' => $SipSettings->quickdial ); print json_encode($account); return true; } else if ($_REQUEST['action'] == 'get_devices'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->getSipDeviceLocations(array($SipSettings->sipId)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return false; } else { foreach ($result[0]->locations as $locationStructure) { $contact=$locationStructure->address.":".$locationStructure->port; if ($locationStructure->publicAddress) { $publicContact=$locationStructure->publicAddress.":".$locationStructure->publicPort; } else { $publicContact=$contact; } $devices[]=array("contact" => $contact, "publicContact" => $publicContact, "expires" => $locationStructure->expires, "user_agent" => $locationStructure->userAgent, "transport" => $locationStructure->transport ); } } print (json_encode($devices)); return true; } else if ($_REQUEST['action'] == 'set_dnd_on'){ $SipSettings->getAcceptRules(); $SipSettings->acceptRules['temporary']=array('groups' =>array('nobody'), 'duration' =>intval($_REQUEST['duration']) ); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->setAcceptRules($SipSettings->sipId,$SipSettings->acceptRules); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; if (intval($_REQUEST['duration'] > 0)) { $_msg=sprintf(_('Do not disturb has been enabled for %d minutes'),intval($_REQUEST['duration'])); } else { $_msg=sprintf(_('Do not disturb has been enabled')); } } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_dnd_off'){ $SipSettings->getAcceptRules(); $SipSettings->acceptRules['temporary']=array('groups' =>array('everybody'), 'duration' =>0 ); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->setAcceptRules($SipSettings->sipId,$SipSettings->acceptRules); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Do not disturb has been disabled')); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_privacy_on'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->addToGroup(array("username" => $SipSettings->username,"domain"=> $SipSettings->domain),"anonymous"); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Caller-ID is now hidden for outgoing calls')); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_privacy_off'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->removeFromGroup(array("username" => $SipSettings->username,"domain"=> $SipSettings->domain),"anonymous"); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 1031) { $_ret=true; $_msg=sprintf(_('Caller-ID is now visible for outgoing calls')); } else { $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } } else { $_ret=true; $_msg=sprintf(_('Caller-ID is now visible for outgoing calls')); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'add_alias'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $username=trim($_REQUEST['username']); if (!strlen($username)) { $return=array('success' => false, 'error_message' => 'Error: missing username' ); print (json_encode($return)); return false; } $_aliasObject=array("id"=>array("username"=>strtolower($username), "domain"=>$SipSettings->domain ), "owner" => intval($SipSettings->owner), "target"=> array("username" => $SipSettings->username,"domain"=> $SipSettings->domain) ) ; $result = $SipSettings->SipPort->addAlias($_aliasObject); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Added alias %s'),strtolower($username)); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_call_forwarding') { $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->getCallDiversions($SipSettings->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } $SipSettings->getVoicemail(); foreach(array_keys($SipSettings->diversionType) as $condition) { $old_diversions[$condition]=$result->$condition; } $_log=''; foreach(array_keys($old_diversions) as $key) { if (isset($_REQUEST[$key])) { printf ("Key $key changed %s",$_REQUEST[$key]); $textboxURI=$_REQUEST[$key]; if ($textboxURI == "" && strlen($SipSettings->mobile_number)) { $textboxURI = $SipSettings->mobile_number; } if ($textboxURI && $textboxURI != "" && !preg_match("/@/",$textboxURI)) { $textboxURI=$textboxURI."@".$SipSettings->domain; } if (preg_match("/^([\+|0].*)@/",$textboxURI,$m)) { $textboxURI=$m[1]."@".$SipSettings->domain; } if (strlen($textboxURI) && $textboxURI != "" && !preg_match("/^sip:/",$textboxURI)) { $textboxURI='sip:'.$textboxURI; } if ($textboxURI) { $new_diversions[$key]=$textboxURI; } $_log.=sprintf("%s=%s ",$key,$textboxURI); $divert_changed=true; } else { if ($old_diversions[$key]) { $new_diversions[$key]=$old_diversions[$key]; } } } if ($divert_changed) { $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->setCallDiversions($SipSettings->sipId,$new_diversions); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Changed diversions %s'),$_log); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else { $return=array('success' => true, 'error_message' => 'Diversions remained the same' ); print (json_encode($return)); return true; } } else if ($_REQUEST['action']) { $return=array('success' => false, 'error_message' => "Error: invalid action" ); print (json_encode($return)); return false; } if (!$_REQUEST['export']) { $SipSettings->showAccount(); print " "; } } class Enrollment { var $init = false; var $create_voicemail = false; var $send_email_notification = true; var $create_email_alias = false; var $create_customer = true; var $timezones = array(); var $default_timezone = 'Europe/Amsterdam'; var $configuration_file = '/etc/cdrtool/enrollment/config.ini'; var $allow_pstn = 1; var $quota = 50; var $prepaid = 1; var $create_certificate = 0; var $customer_belongs_to_reseller = false; function log_action($action){ global $auth; $location = "Unknown"; $_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $location = $_loc['country_name']; } $log = sprintf("CDRTool login username=%s, IP=%s, location=%s, action=%s, script=%s", $auth->auth["uname"], $_SERVER['REMOTE_ADDR'], $location, $action, $_SERVER['PHP_SELF'] ); syslog(LOG_NOTICE, $log); } function Enrollment() { require($this->configuration_file); require("/etc/cdrtool/ngnpro_engines.inc"); $this->soapEngines = $soapEngines; $this->enrollment = $enrollment; $this->loadTimezones(); if (!is_array($this->soapEngines)) { $return=array('success' => false, 'error_message' => 'Error: Missing soap engines configuration' ); print (json_encode($return)); return false; } if (!is_array($this->enrollment)) { $return=array('success' => false, 'error_message' => 'Error: Missing enrollment configuration' ); print (json_encode($return)); return false; } $this->sipDomain = $this->enrollment['sip_domain']; $this->sipEngine = $this->enrollment['sip_engine']; if ($this->enrollment['timezone']) { $this->default_timezone = $this->enrollment['timezone']; } if ($this->enrollment['customer_engine']) { $this->customerEngine = $this->enrollment['customer_engine']; } else { $this->customerEngine = $this->enrollment['sip_engine']; } if ($this->enrollment['email_engine']) { $this->emailEngine = $this->enrollment['email_engine']; } else { $this->emailEngine = $this->enrollment['sip_engine']; } if (is_array($this->enrollment['groups'])) { $this->groups = $this->enrollment['groups']; } else { $this->groups = array(); } $this->reseller = $this->enrollment['reseller']; $this->outbound_proxy = $this->enrollment['outbound_proxy']; $this->xcap_root = $this->enrollment['xcap_root']; $this->msrp_relay = $this->enrollment['msrp_relay']; $this->settings_url = $this->enrollment['settings_url']; $this->ldap_hostname = $this->enrollment['ldap_hostname']; $this->ldap_dn = $this->enrollment['ldap_dn']; $this->conference_server = $this->enrollment['conference_server']; if ($this->enrollment['sip_class']) { $this->sipClass = $this->enrollment['sip_class']; } else { $this->sipClass = 'SipSettings'; } if (!$this->sipEngine) { $return=array('success' => false, 'error_message' => 'Missing sip engine' ); print (json_encode($return)); return false; } if (!$this->sipDomain) { $return=array('success' => false, 'error_message' => 'Missing sip domain' ); print (json_encode($return)); return false; } $this->sipLoginCredentials = array( 'reseller' => intval($this->reseller), 'sip_engine' => $this->sipEngine, 'login_type' => 'admin' ); $this->init=true; } function createAccount() { if (!$this->init) return false; if (!$_REQUEST['email']) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Missing email address' ); print (json_encode($return)); return false; } if (!$this->checkEmail($_REQUEST['email'])) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Invalid email address' ); print (json_encode($return)); return false; } if (!$_REQUEST['password']) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Missing password' ); print (json_encode($return)); return false; } if (!$_REQUEST['display_name']) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Missing display name' ); print (json_encode($return)); return false; } $username=strtolower(trim($_REQUEST['username'])); if (!preg_match("/^[1-9a-z][0-9a-z_.-]{2,64}[0-9a-z]$/",$username)) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'The username must contain at least 4 lowercase alpha-numeric . _ or - characters and must start and end with a positive digit or letter' ); print (json_encode($return)); return false; } $sip_address=$username.'@'.$this->sipDomain; if ($this->create_customer && !$_REQUEST['owner']) { // create owner id $customerEngine = 'customers@'.$this->customerEngine; $this->CustomerSoapEngine = new SoapEngine($customerEngine,$this->soapEngines,$this->customerLoginCredentials); $_customer_class = $this->CustomerSoapEngine->records_class; $this->customerRecords = new $_customer_class($this->CustomerSoapEngine); $this->customerRecords->html=false; $properties=$this->customerRecords->setInitialCredits(array('sip_credit' => 1, 'sip_alias_credit' => 1, 'email_credit' => 1 ) ); if (preg_match("/^(\w+)\s+(\w+)$/",$_REQUEST['display_name'],$m)) { $firstName = $m[1]; $lastName = $m[2]; } else { $firstName = $_REQUEST['display_name']; $lastName = 'Blink'; } $this->log_action("Create owner account ($firstname $lastname) "); $timezone=$_REQUEST['tzinfo']; if (!in_array($timezone, $this->timezones)) { $timezone=$this->default_timezone; } $location = lookupGeoLocation($_SERVER['REMOTE_ADDR']); $customer=array( 'firstName' => $firstName, 'lastName' => $lastName, 'timezone' => $timezone, 'password' => trim($_REQUEST['password']), 'email' => trim($_REQUEST['email']), 'country' => $location['country_code'], 'state' => utf8_encode($location['region']), 'city' => utf8_encode($location['city']), 'properties' => $properties ); if ($this->customer_belongs_to_reseller) { $customer['reseller'] =intval($this->reseller); } if ($location['country_code'] == 'NL') { $customer['tel'] = '+31999999999'; } else if ($location['country_code'] == 'US') { $customer['tel'] = sprintf ("+1%s9999999",$location['area_code']); } else { $customer['tel'] = '+19999999999'; } $_customer_created=false; $j=0; while ($j < 3) { $username.=RandomString(4); $customer['username']=$username; if (!$result = $this->customerRecords->addRecord($customer)) { if ($this->customerRecords->SoapEngine->exception->errorcode != "5001") { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'failed to create non-duplicate customer entry' ); print (json_encode($return)); return false; } } else { $_customer_created=true; break; } $j++; } if (!$_customer_created) { if ($this->sipRecords->soap_error_description) { $_msg=$this->sipRecords->soap_error_description; } else { $_msg='failed to create customer account'; } $return=array('success' => false, 'error' => 'internal_error', 'error_message' => $_msg ); print (json_encode($return)); return false; } else { $this->log_action("Owner account created (". $customer['username'].")"); } $owner=$result->id; if (!$owner) { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'failed to obtain a new owner id' ); print (json_encode($return)); return false; } else { $this->log_action("Owner id is $owner (". $customer['username'].")"); } } else if (is_numeric($_REQUEST['owner']) && $_REQUEST['owner'] != 0 ) { $owner=intval($_REQUEST['owner']); } else { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'no owner information provided' ); print (json_encode($return)); return false; } // create SIP Account $sipEngine = 'sip_accounts@'.$this->sipEngine; $this->SipSoapEngine = new SoapEngine($sipEngine,$this->soapEngines,$this->sipLoginCredentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $this->sipRecords->html=false; $sip_properties[]=array('name'=> 'ip', 'value' => $_SERVER['REMOTE_ADDR']); $sip_properties[]=array('name'=> 'registration_email', 'value' => $_REQUEST['email']); $languages=array("en","ro","nl","es","de"); if (isset($_REQUEST['lang'])){ if (in_array($_REQUEST['lang'],$languages)) { $sip_properties[]=array('name'=> 'language', 'value' => $_REQUEST['lang']); } } if (strlen($timezone)) { $sip_properties[]=array('name'=> 'timezone', 'value' => $timezone); } if (strlen($user_agent)) { $sip_properties[]=array('name'=> 'user_agent', 'value' => trim(urldecode($user_agent))); } $sipAccount = array('account' => $sip_address, 'fullname' => $_REQUEST['display_name'], 'email' => $_REQUEST['email'], 'password' => $_REQUEST['password'], 'timezone' => $timezone, 'prepaid' => $this->prepaid, 'pstn' => $this->allow_pstn, 'quota' => $this->quota, 'owner' => intval($owner), 'groups' => $this->groups, 'properties'=> $sip_properties ); $this->log_action("Create SIP account ($sip_addres)"); if (!$result = $this->sipRecords->addRecord($sipAccount)) { if ($this->sipRecords->SoapEngine->exception->errorstring) { if ($this->sipRecords->SoapEngine->exception->errorcode == 1011) { $return=array('success' => false, 'error' => 'user_exists', 'error_message' => $this->sipRecords->SoapEngine->exception->errorstring ); } else { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => $this->sipRecords->SoapEngine->exception->errorstring ); } } else { $_msg='failed to create sip account'; $return=array('success' => false, 'error' => 'internal_error', 'error_message' => $_msg ); } print (json_encode($return)); $_dictionary=array('customer'=>intval($owner), 'error' => 'internal_error', 'confirm' => true ); $this->customerRecords->deleteRecord($_dictionary); return false; } else { $sip_address=$result->id->username.'@'.$result->id->domain; $this->log_action("SIP account created ($sip_address)"); if ($this->create_certificate) { if (!$passport = $this->generateCertificate($sip_address,$_REQUEST['email'],$_REQUEST['password'])) { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'failed to generate certificate' ); print (json_encode($return)); return false; } } // Generic code for all sip settings pages if ($this->create_voicemail || $this->send_email_notification) { if ($SipSettings = new $this->sipClass($sip_address,$this->sipLoginCredentials,$this->soapEngines)) { if ($this->create_voicemail) { // Add voicemail account $this->log_action("Add voicemail account ($sip_address)"); $SipSettings->addVoicemail(); $SipSettings->setVoicemailDiversions(); } if ($this->send_email_notification) { // Sent account settings by email $SipSettings->sendEmail('hideHtml'); } } } if ($this->create_email_alias) { $this->log_action("Add email alias ($sip_address)"); $emailEngine = 'email_aliases@'.$this->emailEngine; $this->EmailSoapEngine = new SoapEngine($emailEngine,$this->soapEngines,$this->sipLoginCredentials); $_email_class = $this->EmailSoapEngine->records_class; $this->emailRecords = new $_email_class($this->EmailSoapEngine); $this->emailRecords->html=false; $emailAlias = array('name' => strtolower($sip_address), 'type' => 'MBOXFW', 'owner' => intval($owner), 'value' => $_REQUEST['email'] ); $this->emailRecords->addRecord($emailAlias); } $return=array('success' => true, 'sip_address' => $sip_address, 'email' => $result->email, 'settings_url' => $this->settings_url, 'outbound_proxy' => $this->outbound_proxy ); if ($this->create_certificate) { $return['passport'] = $passport; } if ($this->ldap_hostname) { $return['ldap_hostname'] = $this->ldap_hostname; } if ($this->ldap_dn) { $return['ldap_dn'] = $this->ldap_dn; } if ($this->msrp_relay) { $return['msrp_relay'] = $this->msrp_relay; } if ($this->xcap_root) { $return['xcap_root'] = $this->xcap_root; } if ($this->conference_server) { $return['conference_server'] = $this->conference_server; } print (json_encode($return)); return true; } } function generateCertificate($sip_address,$email,$password) { if (!$this->init) return false; if (!is_array($this->enrollment)) { print _("Error: missing enrollment settings"); return false; } if (!$this->enrollment['ca_conf']) { //print _("Error: missing enrollment ca_conf settings"); return false; } if (!$this->enrollment['ca_crt']) { //print _("Error: missing enrollment ca_crt settings"); return false; } if (!$this->enrollment['ca_key']) { //print _("Error: missing enrollment ca_key settings"); return false; } $config = array( 'config' => $this->enrollment['ca_conf'], 'digest_alg' => 'md5', 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => false, ); $dn = array( "countryName" => $this->enrollment['countryName'], "stateOrProvinceName" => $this->enrollment['stateOrProvinceName'], "localityName" => $this->enrollment['localityName'], "organizationName" => $this->enrollment['organizationName'], "organizationalUnitName" => $this->enrollment['organizationalUnitName'], "commonName" => $sip_address, "emailAddress" => $email ); $this->key = openssl_pkey_new($config); $this->csr = openssl_csr_new($dn, $this->key); openssl_csr_export($this->csr, $this->csr_out); openssl_pkey_export($this->key, $this->key_out, $password, $config); $ca="file://".$this->enrollment['ca_crt']; $this->crt = openssl_csr_sign($this->csr, $ca, $this->enrollment['ca_key'], 3650, $config); if ($this->crt==FALSE) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } openssl_x509_export ($this->crt, $this->crt_out); openssl_pkcs12_export ($this->crt, $this->pk12_out, $this->key, $password); return array( 'crt' => $this->crt_out, 'key' => $this->key_out, 'pk12' => $this->pk12_out, 'ca' => file_get_contents($this->enrollment['ca_crt']) ); } function checkEmail($email) { dprint ("checkEmail($email)"); $regexp = "/^([a-z0-9][a-z0-9_.-]*)@([a-z0-9][a-z0-9-]*\.)+([a-z]{2,})$/i"; if (stristr($email,"-.") || !preg_match($regexp, $email)) { return false; } return true; } function loadTimezones () { if (!$fp = fopen("timezones", "r")) { syslog(LOG_NOTICE, 'Error: Failed to open timezones file'); return false; } while ($buffer = fgets($fp,1024)) { $this->timezones[]=trim($buffer); } fclose($fp); } } class PaypalProcessor { var $deny_countries = array(); var $allow_countries = array(); var $deny_ips = array(); var $make_credit_checks = true; var $transaction_results = array('success' => false); var $vat = 0; function PaypalProcessor($account) { require('cc_processor.php'); $this->CardProcessor = new CreditCardProcessor(); $this->account = &$account; } function refundTransaction($transaction_id) { } function doDirectPayment($basket) { if (!is_object($this->account)) { print " "; print 'Invalid account data'; print " "; return false; } if (!is_array($basket)) { print " "; print 'Invalid basket data'; print " "; return false; } if (is_array($this->test_credit_cards) && in_array($_POST['creditCardNumber'], $this->test_credit_cards)) { $this->CardProcessor->environment='sandbox'; } $this->CardProcessor->chapter_class = 'chapter'; $this->CardProcessor->odd_row_class = 'oddc'; $this->CardProcessor->even_row_class = 'evenc'; $this->CardProcessor->note = $this->account->account; $this->CardProcessor->account = $this->account->account; $this->CardProcessor->vat = $this->vat; // set hidden elements we need to preserve in the shopping cart application $this->CardProcessor->hidden_elements = $this->account->hiddenElements; // load shopping items $this->CardProcessor->cart_items=$basket; // load user information from owner information if available otherwise from sip account settings if ($this->account->owner_information['firstName']) { $this->CardProcessor->user_account['FirstName']=$this->account->owner_information['firstName']; } else { $this->CardProcessor->user_account['FirstName']=$this->account->firstName; } if ($this->account->owner_information['lastName']) { $this->CardProcessor->user_account['LastName']=$this->account->owner_information['lastName']; } else { $this->CardProcessor->user_account['LastName']=$this->account->lastName; } if ($this->account->owner_information['email']) { $this->CardProcessor->user_account['Email']=$this->account->owner_information['email']; } else { $this->CardProcessor->user_account['Email']=$this->account->email; } if ($this->account->owner_information['address'] && $this->account->owner_information['address']!= 'Unknown') { $this->CardProcessor->user_account['Address1']=$this->account->owner_information['address']; } else { $this->CardProcessor->user_account['Address1']=''; } if ($this->account->owner_information['city'] && $this->account->owner_information['city']!= 'Unknown') { $this->CardProcessor->user_account['City']=$this->account->owner_information['city']; } else { $this->CardProcessor->user_account['City']=''; } if ($this->account->owner_information['country'] && $this->account->owner_information['country']!= 'Unknown') { $this->CardProcessor->user_account['Country']=$this->account->owner_information['country']; } else { $this->CardProcessor->user_account['Country']=''; } if ($this->account->owner_information['state'] && $this->account->owner_information['state']!= 'Unknown') { $this->CardProcessor->user_account['State']=$this->account->owner_information['state']; } else { $this->CardProcessor->user_account['State']=''; } if ($this->account->owner_information['postcode'] && $this->account->owner_information['postcode']!= 'Unknown') { $this->CardProcessor->user_account['PostCode']=$this->account->owner_information['postcode']; } else { $this->CardProcessor->user_account['PostCode']=''; } if ($_REQUEST['purchase'] == '1' ) { $chapter=sprintf(_("Transaction Results")); $this->account->showChapter($chapter); print " "; // ensure that submit requests are coming only from the current page if ($_SERVER['HTTP_REFERER'] == $this->CardProcessor->getPageURL()) { // check submitted values $errors = $this->CardProcessor->checkForm($_POST); if (count($errors) > 0){ print $this->CardProcessor->displayFormErrors($errors); foreach (array_keys($errors) as $key) { $log_text.=sprintf("%s:%s ",$errors[$key]['field'],$errors[$key]['desc']); } $log=sprintf("CC transaction for %s failed with error: %s",$this->account->account,$log_text); syslog(LOG_NOTICE, $log); return false; } // process the payment $b=time(); $pay_process_results = $this->CardProcessor->processPayment($_POST); if(count($pay_process_results['error']) > 0){ // there was a problem with payment // show error and stop if ($pay_process_results['error']['field'] == 'reload') { print $pay_process_results['error']['desc']; } else { print $this->CardProcessor->displayProcessErrors($pay_process_results['error']); } $e=time(); $d=$e-$b; $log=sprintf("CC transaction for %s failed with error: %s (%s) after %d seconds", $this->account->account, $pay_process_results['error']['short_message'], $pay_process_results['error']['error_code'], $d ); syslog(LOG_NOTICE, $log); return false; } else { $e=time(); $d=$e-$b; $log=sprintf("CC transaction %s for %s completed succesfully in %d seconds", $pay_process_results['success']['desc']->TransactionID, $this->account->account, $d ); syslog(LOG_NOTICE, $log); print "

    "; print _("Transaction completed sucessfully. "); /* if ($this->CardProcessor->environment!='sandbox' && $this->account->first_transaction) { print "

    "; print _("This is your first payment. "); print "

    "; print _("Please allow the time to check the validity of your transaction before activating your Credit. "); print "

    "; print _("You can speed up the validation process by sending a copy of an utility bill (electriciy, gas or TV) that displays your address. "); print "

    "; printf (_("For questions related to your payments or to request a refund please email to %s and mention your transaction id %s. "), $this->account->billing_email, $pay_process_results['success']['desc']->TransactionID ); $this->make_credit_checks=true; } else { print "

    "; print _("You may check your new balance in the Credit tab. "); } */ } if ($this->account->Preferences['ip'] && $_loc=geoip_record_by_name($this->account->Preferences['ip'])) { $enrollment_location=$_loc['country_name'].'/'.$_loc['city']; } else if ($this->account->Preferences['ip'] && $_loc=geoip_country_name_by_name($this->account->Preferences['ip'])) { $enrollment_location=$_loc; } else { $enrollment_location='Unknown'; } if ($_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR'])) { $transaction_location=$_loc['country_name'].'/'.$_loc['city']; } else if ($_loc=geoip_country_name_by_name($_SERVER['REMOTE_ADDR'])) { $transaction_location=$_loc; } else { $transaction_location='Unknown'; } if ($this->account->Preferences['timezone']) { $timezone=$this->account->Preferences['timezone']; } else { $timezone='Unknown'; } $extra_information=array( 'Account Page' => $this->account->admin_url_absolute, 'Account First Name' => $this->account->firstName, 'Account Last Name ' => $this->account->lastName, 'Account Timezone' => $this->account->timezone, 'Enrollment IP' => $this->account->Preferences['ip'], 'Enrollment Location' => $enrollment_location, 'Enrollment Email' => $this->account->Preferences['registration_email'], 'Enrollment Timezone' => $timezone, 'Transaction Location' => $transaction_location ); $result = $this->account->addInvoice($this->CardProcessor); if ($result) { $extra_information['Invoice Page']=sprintf("https://admin.ag-projects.com/admin/invoice.phtml?iId=%d&adminonly=1",$result['invoice']); } if ($this->CardProcessor->saveOrder($_POST,$pay_process_results,$extra_information)) { $this->transaction_results=array('success' => true, 'id' => $this->CardProcessor->transaction_data['TRANSACTION_ID'] ); return true; } else { $log=sprintf("Error: SIP Account %s - CC transaction %s failed to save order",$this->account->account, $this->CardProcessor->transaction_data['TRANSACTION_ID']); syslog(LOG_NOTICE, $log); return false; } } else { print _("Invalid CC Request"); return false; } print " "; } else { print " "; // print the submit form $arr_form_page_objects = $this->CardProcessor->showSubmitForm(); print $arr_form_page_objects['page_body_content']; print " "; } } function fraudDetected() { if (count($this->deny_ips)) { foreach ($this->deny_ips as $_ip) { if ($this->account->Preferences['ip'] && preg_match("/^$_ip/",$this->account->Preferences['ip'])) { $this->fraud_reason=$this->account->Preferences['ip'].' is Blocked'; return true; } if (preg_match("/^$_ip/",$_SERVER['REMOTE_ADDR'])) { $this->fraud_reason=$_SERVER['REMOTE_ADDR'].' is a Blocked'; return true; } } } if (count($this->deny_countries)) { if ($_loc=geoip_record_by_name($this->account->Preferences['ip'])) { if (in_array($_loc['country_name'],$this->deny_countries)) { $this->fraud_reason=$_loc['country_name'].' is Blocked'; return true; } } } if (count($this->allow_countries)) { if ($_loc=geoip_record_by_name($this->account->Preferences['ip'])) { if (!in_array($_loc['country_name'],$this->allow_countries)) { $this->fraud_reason=$_loc['country_name'].' is Not Allowed'; return true; } } } if (count($this->deny_email_domains)) { if (count($this->accept_email_addresses)) { if (in_array($this->account->email,$this->accept_email_addresses)) return false; } list($user,$domain)= explode("@",$this->account->email); foreach ($this->deny_email_domains as $deny_domain) { if ($domain == $deny_domain) { $this->fraud_reason=sprintf ('Domain %s is Not Allowed',$domain); return true; } } } return false; } } class DIDProcessor { function DIDProcessor() { /* http://www.didww.com/support/ API help page: http://open.didww.com */ $this->db = new DB_CDRTool(); require('didww_soap_library.php'); include("/etc/cdrtool/enrollment/config.ini"); if (!$enrollment['did_username'] || !$enrollment['did_key']) { print '

    Error: Missing DID engine credentials'; return false; } if ($enrollment['did_environment'] == 'production') { $this->did_engine = new WebService_DID_World_Wide__DID_World_Wide_Port(); $this->auth_string = sha1($enrollment['did_username'].$enrollment['did_key']); $this->environment='production'; } else { print "

    Testing DID environment

    "; flush(); $this->did_engine = new WebService_DID_World_Wide__DID_World_Wide_Port_Testing(); $this->auth_string = sha1($enrollment['did_username'].$enrollment['did_key'].'sandbox'); $this->environment='testing'; } $this->did_engine->_options['timeout'] = 30; } function getPrefixesFromRemote () { if (!$this->auth_string) return false; $result = $this->did_engine->didww_getdidwwregions($this->auth_string,$country); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { foreach ($result as $_country) { foreach ($_country->cities as $_city) { $prefix = $_country->country_prefix.$_city->city_prefix; if (!$_city->isavailable) continue; $prefixes[$prefix]=array('country_prefix' => trim($_country->country_prefix), 'country_name' => trim($_country->country_name), 'country_iso' => trim($_country->country_iso), 'city_name' => trim($_city->city_name), 'city_prefix' => trim($_city->city_prefix), 'setup' => $_city->setup, 'monthly' => $_city->monthly ); } } } return $prefixes; } function getPrefixes () { $query=sprintf("select * from ddi_cache where environment = '%s' and DATE_ADD(date, INTERVAL +1 day) > NOW()",addslashes($this->environment)); if (!$this->db->query($query)) return false; if ($this->db->num_rows()) { $this->db->next_record(); $prefixes = json_decode($this->db->f('cache'),true); if (!is_array($prefixes)) { $prefixes = $this->cachePrefixes(); } } else { $prefixes=$this->cachePrefixes(); } return $prefixes; } function cachePrefixes() { if ($prefixes = $this->getPrefixesFromRemote()) { $query=sprintf("delete from ddi_cache where environment = '%s'",addslashes($this->environment)); $this->db->query($query); $query=sprintf("insert into ddi_cache (cache,date,environment) values ('%s', NOW(),'%s')",addslashes(json_encode($prefixes)),addslashes($this->environment)); $this->db->query($query); return $prefixes; } else { return false; } } function getResellerInfo() { if (!$this->auth_string) return false; $result = $this->did_engine->didww_getdidwwapidetails($this->auth_string); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { print "

    ";
                 print_r($result);
                 print "
    "; } } function createOrder($data) { if (!$this->auth_string) return false; print "
    ";
             print_r($data);
             print "
    "; $result = $this->did_engine->didww_ordercreate($this->auth_string, $data['customer_id'], $data['country_iso'], $data['city_prefix'], $data['period'], $data['map_data'], $data['prepaid_funds'], $data['uniq_hash'] ); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $query=sprintf ("insert into ddi_numbers ( `customer_id`, `country_name`, `city_name`, `did_number`, `did_status`, `did_timeleft`, `did_expire_date_gmt`, `order_id`, `order_status`, `sip_address`, `did_setup`, `did_monthly`, `did_period`, `prepaid_balance`, `environment` ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", addslashes($data['customer_id']), addslashes($result->country_name), addslashes($result->city_name), addslashes($result->did_number), addslashes($result->did_status), addslashes($result->did_timeleft), addslashes($result->did_expire_date_gmt), addslashes($result->order_id), addslashes($result->order_status), addslashes($data['map_data']['map_detail']), addslashes($result->did_setup), addslashes($result->did_monthly), addslashes($result->did_period), addslashes($result->prepaid_balance), addslashes($this->environment) ); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID createOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } } } function renewOrder($data) { if (!$this->auth_string) return false; print "

    ";
             print_r($data);
             print "
    "; $result = $this->did_engine->didww_orderautorenew($this->auth_string, $data['customer_id'], $data['number'], $data['period'], $data['uniq_hash'] ); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $query=sprintf ("update ddi_numbers set did_timeleft = '%s' and did_expire_date_gmt = '%s' where did_number = '%s' ", addslashes($result->did_timeleft), addslashes($result->did_expire_date_gmt), addslashes($result->did_number) ); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID renewOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } print $query; } } function cancelOrder($data) { if (!$this->auth_string) return false; print "

    ";
             print_r($data);
             print "
    "; $result = $this->did_engine->didww_ordercancel($this->auth_string, $data['customer_id'], $data['number'] ); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $query=sprintf ("delete from ddi_numbers where did_number = '%s'",addslashes($result->did_number)); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID cancelOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } print $query; } } function getOrders($sip_address) { $orders=array(); $query=sprintf ("select * from ddi_numbers where sip_address = '%s' and environment = '%s'",addslashes($sip_address),addslashes($this->environment)); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID createOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } else { while ($this->db->next_record()) { $orders[$this->db->f('did_number')]=array('country_name' => $this->db->f('country_name'), 'city_name' => $this->db->f('city_name'), 'did_status' => $this->db->f('did_status'), 'did_timeleft' => $this->db->f('did_timeleft'), 'did_expire_date_gmt' => $this->db->f('did_expire_date_gmt'), 'order_id' => $this->db->f('order_id'), 'order_status' => $this->db->f('order_status'), 'sip_address' => $this->db->f('sip_address'), 'did_setup' => $this->db->f('did_setup'), 'did_monthly' => $this->db->f('did_monthly') ); } } return $orders; } } function RandomIdentifier($length = 30) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, strlen($characters) - 1)]; } return $randomString; } function getDisplayNameFromFromHeader($header) { // match all words and whitespace, will be terminated by '<' $name = preg_match("/([\w\s]+).*<.*/", $header, $matches); if (isset($matches[1])) { return trim($matches[1]); } else { return ""; } } if (file_exists("/etc/cdrtool/local/sip_settings.php")) { require_once '/etc/cdrtool/local/sip_settings.php'; } ?>